一、前言
1.为什么使用Map集合
1.1.快速查找
如果需要根据一个唯一的标识(如ID)来快速查找对应的数据记录,可以将这些数据记录按照ID作为键存储到Map中,这样就可以通过ID快速查找到对应的数据记录。
1.2.数据去重
如果需要对一批数据进行去重操作,可以使用Map来去重。将数据作为Map的键存储到Map中,由于Map中每个键只能对应一个值,如果将重复的数据作为键存储到Map中,则只会存在一份数据记录,实现了去重任务。
1.3.统计频次
如果需要统计一些数据的频次,可以使用Map来实现。将需要统计的数据作为Map的键存储到Map中,每次出现一次数据就将Map中对应的值加1,这样就可以快速得到每个数据出现的频次。
1.4.内存中保存数据
如果需要将一些数据保存在内存中,可以使用Map将这些数据存储起来。由于Map底层实现是哈希表,查找效率较高,所以在实现中,我们可以使用Map来保存相应的数据。
2.使用场景
综上所属,如何统计字符串中的字符出现次数?
我们可以利用toCharArray方法先将字符串转换为字符数组,然后遍历该数组,判断该字符是否存在map集合中,如果存在value加1,反之就追加到map集合内并设默认值1。(map集合建议使用泛型键-字符/值-出现次数)
// 定义一个变量保存字符串 String str = "fhyuaefcahwhchansgowavfawxwxwjwgliq"; // 转换为char类型 char[] charArray = str.toCharArray(); // 定义一个map集合保存单字符和出现次数 Map<Character, Integer> map = new HashMap<>(); // 遍历char数组 for (char c : charArray) { // 通过键拿到值,如果值为空说明不存在,添加到map集合中 // 如果存在拿到当前键的值数量加一 Integer integer = map.get(c); if (integer != null) { map.put(c, integer + 1); } else { map.put(c, 1); } } // 利用entryset输出结果 Set<Entry<Character, Integer>> entrySet = map.entrySet(); System.out.println("--------------旧集合----没有排序---------------------"); for (Entry<Character, Integer> entry : entrySet) { System.out.println(entry.getKey() + "出现了" + entry.getValue() + "次"); }
有兴趣的小伙伴可以自己数数看哦!!
进阶版---按照出现次数排序,如果出现次数一致按照字母升序
// 利用Treemap排序 TreeMap<Character, Integer> treemap = new TreeMap<>(new Comparator<Character>() { @Override public int compare(Character o1, Character o2) { if(map.get(o2) - map.get(o1)==0) { return o1 -o2; } return map.get(o2) - map.get(o1); } }); // fore遍历旧集合 Set keySet = map.keySet(); for (Object object : keySet) { // 添加到新集合 treemap.put((Character) object, map.get(object)); } Set<Character> keySet2 = treemap.keySet(); System.out.println("----新集合----按照次数降序,如果次数一致按照字母升序--------); for (Character character : keySet2) { System.out.println(character + "出现了" + treemap.get(character)+ "次"); }
😎是不是很简单呢?和我一起学IT让你的代码变得有趣!!
二、Map集合特点
1.数据结构
增删查
Map map = new HashMap<>(); // 新增 map.put("name", "xw"); map.put("age", 18); map.put("name2", "wh"); map.put("age2", 18); // 查看 System.out.println(map);// {name=xw, name2=wh, age=18, age2=18} // 删除 map.remove("name2"); System.out.println(map);// {name=xw, age=18, age2=18}
注意:Map集合没有修改方法,因为它没有下标,但是它的键是唯一的可以通过覆盖的方式达到修改的效果。
特点:键值对形式存储;键可以为空。
2.遍历方式
因为Map没有下标,也没有继承Collection接口,所以它的遍历方式只有三种。
使用fore遍历
Map map = new HashMap<>(); map.put("name", "xw"); map.put("age", 18); map.put("name2", "wh"); map.put("age2", 18); // 先获取键key Set keySet = map.keySet(); for (Object object : keySet) { // 根据键得到值 System.out.println("键:" + object + "--值:" + map.get(object)); // 打印结果为: //键:name--值:xw //键:name2--值:wh //键:age--值:18 //键:age2--值:18 }
使用entryset遍历
Set entrySet = map.entrySet(); for (Object object : entrySet) { // 因为这个map集合没有用泛型,所以需要强制转换 Map.Entry maps = (Entry) object; // 调用maps.getKey()获取键 / 调用maps.getValue()获取值 System.out.println("键=" + maps.getKey() + " 值=" + maps.getValue()); } //打印结果为 //键=name 值=xw //键=name2 值=wh //键=age 值=18 //键=age2 值=18
使用values()方法遍历
//values遍历 for (Object object : map.values()) { System.out.println(object); } //打印结果 //xw //wh //18 //18
注意:这种方式拿不到键,只能拿到value(慎用)