java的集合框架set 和map的深入理解
2017-10-30 17:33
661 查看
Java的集合框架之Map的用法详解
Map有两种比较常用的实现:HashMap 和 TreeMap。HashMap: HashMap 也是无序的,也是按照哈希编码来排序的,允许使用null 值和null 键
TreeMap: TreeMap 是有顺序的,按照用户的输入顺序进行排序,TreeMap 按照顺序村塾“键/值”对。值得注意的是 在TreeMap 中是不允许“键”重复的,但是可以允许“值”重复。下面通过一个简单的例子进行说明。
import java.util.Collection; import java.util.HashMap; import java.util.Iterator; import java.util.Map; import java.util.Set; public class Test2 { public static void main(String[] args) { Map<String,Integer> map = new HashMap<String,Integer>(); //Map<String,Integer> map = new TreeMap<String,Integer>(); //添加元素 map.put("tom",20); map.put("rose", 18); map.put("mike",18); map.put("black", 21); map.put("tom",19);//键 是不允许重复的,但是数值是可以重复的 System.out.println(map); // 输出结果: {rose=18, tom=19, mike=18, black=21} //取出map中的元素 int x = map.get("tom"); System.out.println(x);//19 //Map 集合的遍历方法 //"键的集合"用到keySet 方法 Set<String> set = map.keySet();//此时的set存放的都是字符串(键值) for(String s:set) { System.out.println(s+"="+map.get(s)+" "); } System.out.println("-------------------------"); //用迭代器进行遍历 Iterator<String> iterator = set.iterator(); while(iterator.hasNext()) { String s = iterator.next(); System.out.println(s+"="+map.get(s)+" "); } //"值的遍历",通过map.vaules()方法获取 Collection<Integer> value = map.values();//返回值类型为Collection //"值的集合",通过map.vaules()方法获取 Collection<Integer> value = map.values();//因为是对值的遍历,所以泛型也就定义成Integer System.out.println(value); //值的遍历 Iterator<Integer> iterator = value.iterator(); while(iterator.hasNext()) { int v = iterator.next(); System.out.println(v+" "); } //键值对 的集合,通过map.entrySet()方法获取 Set<Map.Entry<String, Integer>> set = map.entrySet();//注意此处的泛型要和上面map的类型保持一致 System.out.println(set); for (Map.Entry<String, Integer> me:set) { String key = me.getKey(); Integer value = me.getValue(); System.out.println(key+"="+value+" "); } System.out.println("--------------------------"); Iterator<Map.Entry<String, Integer>> iterator = set.iterator(); while(iterator.hasNext()) { Map.Entry<String, Integer> entry = iterator.next(); System.out.println(entry.getKey()+" "+entry.getValue()+" "); } } }
set 和map 的几个小例子
例子(12)
创建一个TreeSet 对象,并在其中添加一些员工对象(Empoyee),其姓名和工资分别是:张三 8000,李四6000,王五 5600,马六 7500 。最后按照工资的大小,降序输出。(提示:让Employee 对象实现 Comparable接口)
public class Employee implements Comparable{ private String name; private int salary; public Employee(String name, int salary) {//对生成的属性进行初始化,生成带有参数的方法 super(); this.name = name; this.salary = salary; } public Employee() {//生成不带参数的方法,其实这里的作用也是为了在测试类中更好的调用此方法 super(); } public String getName() { return name; } public void setName(String name) { this.name = name; } public int getSalary() { return salary; } public void setSalary(int salary) { this.salary = salary; } @Override public int compareTo(Object p) { // TODO Auto-generated method stub Employee p1 = (Employee)p; if (this.salary>p1.salary)//用当前当前的salary 和p1的salary 进行比较 { return -1; //返回的是后面一个数减去前面一个数的“位差” } else if (this.salary < p1.salary) { return 1; } else return 0; } }
import java.util.Iterator; import java.util.Set; import java.util.TreeSet; public class Test { public static void main(String[] args) { //TreeSet 是用户自定义的顺序(默认) Set<Employee> set = new TreeSet<Employee>();//用set集合来完成“一个类”的操作(这个地方可以和) Employee p1 = new Employee("张三",8000); Employee p2 = new Employee("李四",6000); Employee p3 = new Employee("王五",5600); Employee p4 = new Employee("马六",8000); set.add(p1);//add 方法自动调用compare 方法,因为重新写了此方法,所以此处可以进行比较 set.add(p2); set.add(p3); set.add(p4); for (Employee e:set) { System.out.println(e.getName()+":"+e.getSalary()); } System.out.println("--------------------------------"); Iterator<Employee> iterator = set.iterator(); while(iterator.hasNext()) { Employee p = iterator.next(); System.out.println(p.getName()+":"+p.getSalary()); } } }
对于上例中的排序这里做简要说明:这里是重写了
compareTo方法,因为原来是方法是无法对
salary和
name进行排序的,这样重写了,就可以实现排序的效果。
return返回的是 位差 如果前面的数比后面的数大,且位差是正数则说明后面的比前面的还要大,并按此位差进行插入。依次类推。
@Override public int compareTo(Object p) { // TODO Auto-generated method stub Employee p1 = (Employee)p; if (this.salary>p1.salary)//用当前当前的salary 和p1的salary 进行比较 { return -1; //返回的是后面一个数减去前面一个数的“位差” } else if (this.salary < p1.salary) { return 1; } else return 0; }
例子(13)
创建一个Customer类,类中的属性有姓名(name)、年龄(age)、性别(gender),每个属性分别有get/set 方法。然后创建两个Customer 对象:张立、18、女和王猛、22、男。把这两个对象存储在ArrayList 对象中,然后从ArrayList 对象读取出来。
package yjlblog.www.ch01; public class Customer { private String name; private int age; private String gender; public Customer(String name, int age, String gender) { super(); this.name = name; this.age = age; this.gender = gender; } public Customer() { super(); } public String getName() { return name; } public void setName(String name) { this.name = name; } public int getAge() { return age; } public void setAge(int age) { this.age = age; } public String getGender() { return gender; } public void setGender(String gender) { this.gender = gender; } }
package yjlblog.www.ch01; import java.util.HashSet; import java.util.Set; public class SetDemo { public static void main(String[] args) { Set<String> set = new HashSet(); set.add("first"); set.add("second"); set.add("third"); set.add("forth"); //set 中的顺序和插入顺序是不一致的 //HashSet 按照哈希码来排序 //TreeSet 按照字典序排序 //set 中不允许出现相同的元素 for(int i = 0;i <set.size();i++){ System.out.println(); } } } //set 也是用循环来实现遍历的
package yjlblog.www.ch01; import java.util.ArrayList; public class Test { public static void main(String[] args) { Customer c1 = new Customer("张立",18,"女"); Customer c2 = new Customer("王猛",18,"男"); ArrayList<Customer> list = new ArrayList<Customer>();//泛型引用的是Customer类 list.add(c1); //来向”“动态数组ArrayList”中存放自己定义的属性方法 list.add(c2); for(Customer c:list){//注意此处的c 的类型是和list的类型一致的 System.out.println("姓名"+c.getName()); System.out.println("年龄"+c.getAge());//用get方法来说的得到数据 System.out.println("性别"+c.getGender()); } }//遍历都是使用循环的,不管事动态数组还是链表。实质可以看成是数组 }
例子(11)
创建一个HashMap 对象,并在其中添加一些员工的姓名和工资:张三,8000,李四 6000.然后从HashMap对象中获取这两个人的薪水并打印出来,接着把张三的工资改为8500,再把他们的薪水显示出来。
import java.util.Map; import java.util.Set; import java.util.TreeMap; public class TEST1 { public static void main(String[] args) { Map<String,Integer> map=new TreeMap<String,Integer>(); map.put("张三",8000); map.put("李四", 6000); map.put("张三", 8500); //从HashMap对象中获取两个人的薪水并打印 Set<String> set=map.keySet();//此时set中存放的是字符串(键值) System.out.println(set); for(String s:set){ System.out.print(s+"="+map.get(s)+" "); } } }
例子(14)
给定一个字符串“today is a special day”,长度为任意,要求找出其出现次数最多的字符及计算次数。(提示:可以用HashMap、HashSet、Collection实现)
package www.yjlblog.cn; import java.util.HashMap; import java.util.Set; public class Test { public static void main(String[] args) { HashMap<String,Integer> map = new HashMap<String,Integer>();//注意HashMap中的两个参数 //此处的处理时用键值对 来实现的 map.put("张三", 8000); map.put("李四", 6000); Set<String> set = map.keySet(); //获取键值对 “键的集合”只有键。并没有值 for(String key:set) //遍历所有的键 { int value = map.get(key);//通过map.get() 方法来来找到键 所对应的值 System.out.println(key+":"+value); } System.out.println("-----------------"); map.put("张三", 8500); //根据键 不能重复来实现数据的更新 set = map.keySet(); for(String key:set) { int value = map.get(key); System.out.println(key+":"+value); } } }
例子(3)
创建一个省市联动的集合,并根据输入的省份名称输出其所有的城市名称。
package com.wfu.ch07; import java.util.HashMap; import java.util.Map; import java.util.Scanner; public class Test4 { public static void main(String[] args) { Map<String, String[]> map = new HashMap<String, String[]>(); String[] sd = { "济南", "青岛", "潍坊", "淄博", "滨州", "菏泽", "临沂" }; String[] hb = { "石家庄", "唐山", "廊坊", "沧州", "承德", "保定", "邯郸" }; String[] sx = { "太原", "大同", "吕梁", "临汾", "阳泉", "长治", "晋城" }; String[] ln = { "沈阳", "大连", "鞍山", "抚顺", "本溪", "丹东", "锦州" }; map.put("山东", sd); map.put("河北", hb); map.put("山西", sx); map.put("辽宁", ln); Scanner sc = new Scanner(System.in); while (true) { System.out.println("请输入一个省份名称或者输入退出:"); String name = sc.next(); if ("退出".equals(name)) { break; } else { String[] city = map.get(name); if (city != null) { System.out.print(name + ":"); for (String x : city) { System.out.print(x + " "); } } else { System.out.print("输入的省份不存在,请重新输入"); } } System.out.println(); } } }
例子(2)
创建一个不含重复元素的由50个100以内的整数所组成的随机数的集合,并按升序打印出来
package www.yjlblog.cn; import java.util.Random; import java.util.Set; import java.util.TreeSet; public class Test2 { public static void main(String[] args) { Set <Integer> set = new TreeSet<Integer>();//s这里用set的实现类TreeSet //根据TressSet的特点事由顺序的 Random random = new Random();//产生随机数 // for(int i = 0;i < 50;i++)//如果用这种方法的话,很可能就会出先重复的数字 // { // set.add(random.nextInt(100)); // } int i = 0; while(i < 50) { if(set.add(random.nextInt(100)))//add 方法返回的是一个布尔值 { i++; } } System.out.println(set.size()); i = 1; for(Integer x:set) { System.out.print(x+" "); if (i%10 == 0) { System.out.println(); } i++; } } }
相关文章推荐
- 【深入理解java集合系列】List,Set,Map用法以及区别
- 深入理解Java之集合框架
- Java 集合深入理解(14):Map 概述
- Java 集合深入理解(14):Map 概述
- Java基础知识强化之集合框架笔记67:Map集合面试题之List,Set,Map等接口是否继承自Map接口
- Java 集合深入理解(14):Map 概述
- Map、Set、Iterator迭代详解与Java平台的集合框架
- 黑马程序员--java基础--集合框架Set,集合框架map
- 深入理解Java集合之Map
- JAVA简单理解累计框架 List、Set、Iterator、Map
- java基础——集合框架(List、Set、Map)
- java 集合框架 Set Map List
- Java 集合理解(List;Set;Map)
- 深入理解Java之集合框架
- Java 集合深入理解(15):AbstractMap
- java中的集合框架Set 、List 、Map
- Java 集合深入理解(15):AbstractMap
- java 中的 set以及集合,map,list等的理解
- Java 集合深入理解(15):AbstractMap
- java基础之集合框架--HashSet深入理解