Map集合的概述
Interface Map<K,V> K: 键的类型; V:值的类型;
将键映射到值的对象; 不能包含重复的键;每个键可以映射到最多一个值
举例:学生的学号和姓名
cs0001 张三丰 cs0002 李连杰 cs0003 周星驰创建集合的对象
多态的方式具体的实现类HashMap public class MapDemo01 { public static void main(String[] args) { //创建集合对象 Map<String,String> map = new HashMap<String,String>();//HashMap重写了toString方法用=拼接 //V put(K key, V value)将指定的值与该映射中的指定的键相关联 map.put("cs0001","张三丰"); map.put("cs0002","林黛玉"); map.put("cs0003","陈大帅"); System.out.println(map);//{cs0002=林黛玉, cs0003=陈大帅, cs0001=张三丰} //输出集合对象 System.out.println(map); //{cs0002=林黛玉, cs0003=陈大帅, cs0001=张三丰} //{cs0002=林黛玉, cs0003=张无忌, cs0001=张三丰} //V put 可以用来添加和修改,二次添加相当于覆盖前一个值,也就是修改 } }我们刚才存储的元素都是成对出现的,所以我们把Map看成是一个夫妻对的集合
遍历思路:
把所有的丈夫都集中起来遍历丈夫的集合,获取到每一个丈夫根据丈夫去找对应的妻子转换为Map集合中的操作:
获取所有键的集合。用KeySet()方法实现遍历键的集合,获取到每一个键。用增强for实现根据键去找值。用get(Object key)方法实现 public class MapDemo03 { public static void main(String[] args) { //创建集合对象 Map<String,String> map = new HashMap<String, String>(); //添加元素 map.put("杨过","小龙女"); map.put("张三丰","张无忌"); map.put("李小龙","李国豪"); //获取所有键的集合。用KeySet实现 Set<String> keySet = map.keySet(); //遍历集合 for (String key : keySet){ String value = map.get(key); System.out.println(key+","+value); } } } ------------------ 杨过,小龙女 李小龙,李国豪 张三丰,张无忌我们刚才存储的元素都是成对出现的,所以我们把Map看成是一个夫妻对的集合
遍历思路:
获取所有结婚证的集合遍历结婚证的集合,得到每一个结婚证根据结婚证获取丈夫和妻子转换为Map集合中的操作:
获取所有键值对对象的集合
Set<Map.Entry<K,V>> entrySet(): 获取所有键值对对象的集合遍历所有键值对对象的集合,得到每一个键值对对象
用增强for实现,得到每一个Map.Entry
根据键值对对象获取键和值
用getKey()得到键用getValue()得到值 public class MapDemo04 { public static void main(String[] args) { //创建集合对象 Map<String,String> map = new HashMap<String, String>(); //添加元素 map.put("杨过","小龙女"); map.put("张三丰","张无忌"); map.put("李小龙","李国豪"); //获取所有键值对对象的集合 Set<Map.Entry<K,V>> entrySet() Set<Map.Entry<String, String>> entrySet = map.entrySet(); //遍历键值对对象的集合,得到每一个键值对对象 for (Map.Entry<String,String> entry : entrySet){ //根据键值对对象获取键和值 String key = entry.getKey(); String value = entry.getValue(); System.out.println(key+","+value); } } } ------------------- 杨过,小龙女 李小龙,李国豪 张三丰,张无忌需求:创建一个HashMap集合,键是学号(String),值是学生对象(Student)。存储三个键值对元素,并遍历
思路:
定义学生类创键HashMap集合对象创建学生对象把学生添加到集合遍历集合 方式1:键找值方式2:键值对找键和值 public class HashMapDemo { public static void main(String[] args) { //创建HashMap集合对象 HashMap<String,Student> map = new HashMap<String, Student>(); //创建学生对象 Student s1 = new Student("陈大帅",18); Student s2 = new Student("陈二帅",38); Student s3 = new Student("陈三帅",8); //把学生对象添加到集合 map.put("cs001",s1); map.put("cs002",s2); map.put("cs003",s3); //遍历结合方式一,键找值 Set<String> set = map.keySet(); for (String s : set){ Student student = map.get(s); System.out.println(s+","+student.getName()+","+student.getAge()); } System.out.println("------------"); //遍历方式二,键值对对象找键和值 Set<Map.Entry<String, Student>> entrySet = map.entrySet(); for (Map.Entry<String, Student> entry : entrySet){ String key = entry.getKey(); Student value = entry.getValue(); System.out.println(key+","+value.getName()+","+value.getAge()); } } } ------------- cs001,陈大帅,18 cs002,陈二帅,38 cs003,陈三帅,8 ------------ cs001,陈大帅,18 cs002,陈二帅,38 cs003,陈三帅,8需求:创建一个HashMap集合,键是学生对象(Student),值是居住地(String)。存储多个键值对元素,并遍历。
要求保证键的唯一性:如果学生对象的成员变量值相同,我们就认为是同一个对象(这里要在学生类中重写两个方法)
思路:
定义学生类
创建HashMap集合对象
创建学生对象
把学生添加到集合
遍历集合
在学生类中重写两个
hashCode()equals() public class MapDemo { public static void main(String[] args) { //创建HashMap集合对象 HashMap<Student,String> map = new HashMap<Student,String>(); //创建学生对象 Student s1 = new Student("小红",11); Student s2 = new Student("大黄",22); Student s3 = new Student("小黑",33); Student s4 = new Student("大黄",22); //把学生对象添加到集合 map.put(s1,"南京"); map.put(s2,"扬州"); map.put(s3,"上海"); System.out.println("--------"); //遍历集合一 Set<Map.Entry<Student, String>> entrySet = map.entrySet(); for (Map.Entry<Student, String> me : entrySet){ Student key = me.getKey(); String value = me.getValue(); System.out.println(key.getName()+","+key.getAge()+","+value); } System.out.println("------"); map.put(s4,"昆山");//会覆盖 //遍历集合二 Set<Student> keySet = map.keySet(); for (Student key : keySet){ String value = map.get(key); System.out.println(key.getName()+","+key.getAge()+","+value); } } } ----------- 小红,11,南京 大黄,22,扬州 小黑,33,上海 ------ 小红,11,南京 大黄,22,昆山 小黑,33,上海需求:创建一个ArrayList集合,存储三个元素,每一个元素都是HashMap,每一个HashMap的键和值都是String,并遍历
思路:
创建ArrayList集合创建HashMap集合,并添加键值对元素把HashMap作为元素添加到ArrayList集合遍历ArrayList集合 public class ArrayListIncludeHashMapDemo { public static void main(String[] args) { //创建ArrayList集合对象 ArrayList<HashMap<String, String>> array = new ArrayList<HashMap<String, String>>(); //创建HashMap集合,并添加键值对元素 HashMap<String, String> hm1 = new HashMap<String, String>(); hm1.put("张三", "李四"); hm1.put("郭靖", "黄蓉"); //把HashMap作为元素添加到ArrayList集合中 array.add(hm1); HashMap<String, String> hm2 = new HashMap<String, String>(); hm2.put("李静", "大同"); hm2.put("杨过", "小龙女"); array.add(hm2); HashMap<String, String> hm3 = new HashMap<String, String>(); hm3.put("范闲", "鸡腿妹妹"); hm3.put("张刚", "冯小刚"); array.add(hm3); //遍历ArrayList集合 for (HashMap<String, String> hm : array) { Set<String> keySet = hm.keySet(); for (String key : keySet) { String value = hm.get(key); System.out.println(key + "," + value); } } } } ---------------------------- 张三,李四 郭靖,黄蓉 杨过,小龙女 李静,大同 张刚,冯小刚 范闲,鸡腿妹妹需求:创建一个HashMap集合,存储三个键值对元素,每一个键值对元素的键都是String,值是ArrayList,
每一个ArrayList的元素是String,并遍历
思路:
创建HashMap集合创建ArrayList集合,并添加元素将ArrayList作为元素添加到HashMap集合中遍历HashMap集合 public class HashMapIncludeArrayListDemo { public static void main(String[] args) { //创建HashMap集合 HashMap<String, ArrayList<String>> hm = new HashMap<String, ArrayList<String>>(); //创建ArrayList集合 ArrayList<String> array1 = new ArrayList<String>(); array1.add("hello"); array1.add("world"); hm.put("cs01",array1); ArrayList<String> array2 = new ArrayList<String>(); array2.add("王二麻子"); array2.add("西施"); hm.put("cs002",array2); ArrayList<String> array3 = new ArrayList<String>(); array3.add("麻子"); array3.add("狗子"); hm.put("cs003",array3); //遍历HashMap集合 Set<String> keySet = hm.keySet(); for (String key : keySet){ System.out.println(key); ArrayList<String> arrayList = hm.get(key); for (String value : arrayList){ System.out.println("\t"+value); } } } } ------------- cs002 王二麻子 西施 cs003 麻子 狗子 cs01 hello world需求:键盘录入一个字符串,要求统计字符串中每个字符串出现的次数。
举例:键盘录入"aababcabacbacde" 在控制台输出:“a(6)b(4)c(3)d(1)e(1)”
分析:
我们可以把结果分成几个部分来看:a(6),b(4),c(3),d(1),e(1)
每一个部分可以看成是:字符和字符对应的次数组成
这样的数据,我们可以通过HashMap集合来存储,键是字符,值是字符出现的次数
注意:键是字符,类应该是Character;值是字符出现的次数,类型应该是Integer
思路:
键盘录入一个字符串创建HashMap集合,键是Character,值是Integer遍历字符串得到每一个字符拿得到的每一个字符作为键到HashMap集合中去找对应的值,看其返回值 如果返回值是null:说明该字符在HashMap集合中不存在,就把该字符作为键,1作为值存储如果返回值不是null:说明该字符在HashMap集合中存在,把该值+1,然后重新存储该字符和对应的值 遍历HashMap集合,得到键和值,按照要求进行拼接输出结果 public class HashMapDemo { public static void main(String[] args) { //1.键盘录入一个字符串 Scanner sc = new Scanner(System.in); System.out.println("请输入一个字符串:"); String line = sc.nextLine(); //2.创建HashMap集合, // HashMap<Character,Integer> hm = new HashMap<Character, Integer>(); TreeMap<Character,Integer> hm = new TreeMap<Character, Integer>(); //3.遍历字符串,得到每一个字符 for (int i=0;i<line.length();i++){ char key = line.charAt(i); //通过键获取到HashMap中对应的值 Integer vlaue = hm.get(key); //如果返回值是null:说明该字符在HashMap集合中不存在,就把该字符作为键,1作为值存储 if (vlaue == null){ hm.put(key,1); }else { //如果返回值不是null:说明该字符在HashMap集合中存在,把该值+1,然后重新存储该字符和对应的值 vlaue++; hm.put(key,vlaue); } } //遍历HashMap集合,得到键和值,按照要求进行拼接 StringBuilder sb = new StringBuilder(); Set<Character> keySet = hm.keySet(); for (Character key : keySet){ Integer value = hm.get(key); sb.append(key).append("(").append(value).append(")"); } String result = sb.toString(); //输出结果 System.out.println(result); } } -------------- 请输入一个字符串: ahdskghqoehakdhg a(2)q(1)s(1)d(2)e(1)g(2)h(4)k(2)o(1) ---------使用TreeMap后 请输入一个字符串: adsghaadaf a(4)d(2)f(1)g(1)h(1)s(1)