目录
Map集合的遍历方式
键找值
键值对
Lambda
Map集合案例
需求与分析
问题解决
Map集合的遍历方式
- 键找值
先获取Map集合全部的键,再通过遍历键来找值。
- 键值对
把“键值对”看成一个整体进行遍历(较为复杂)
- Lambda
JDK 1.8 开始之后的新技术,结合Lambda表达式进行遍历
键找值
需要用到Map的如下方法:
方法名称 | 说明 |
---|---|
public Set<K> keySet() | 获取所有键的集合 |
public V get(Object key) | 根据键获取其对应的值 |
实例演示
import java.util.HashMap;
import java.util.Map;
import java.util.Set;public class MapTraversal1 {public static void main(String[] args){//准备一个Map集合Map<String,Double> map = new HashMap<>();map.put("蜘蛛精",162.5);map.put("蜘蛛精",169.8);map.put("紫霞",165.8);map.put("至尊宝",169.5);map.put("牛魔王",183.6);System.out.println(map);System.out.println("-----------------------");//1.获取Map集合的全部键Set<String> keys = map.keySet();System.out.println(keys);System.out.println("-----------------------");//2.遍历全部的键,根据键获取其对应的值for(String key:keys){double value = map.get(key);System.out.println(key + "=====>" + value);}}
}
运行结果:
键值对
把“键值对”看成一个整体进行遍历,一般的形式是:
for (元素类型 变量:集合){
...
}
也就是,
for (元素类型 kv:map){
...
}
但是,元素类型无法直接确定。
这时就需要用到其他方法:
Map提供的方法 | 说明 |
---|---|
Set<Map.Entry<K, V>> entrySetO | 获取所有“键值对”的集合 |
Map.Entry提供的方法 | 说明 |
---|---|
K getKey() | 获取键 |
V getValue() | 获取值 |
实例演示
import java.util.HashMap;
import java.util.Map;
import java.util.Set;public class MapTraversal2 {public static void main(String[] args) {Map<String,Double> map = new HashMap<>();map.put("蜘蛛精",169.8);map.put("紫霞",165.8);map.put("至尊宝",169.5);map.put("牛魔王",183.6);System.out.println(map);System.out.println("-----------------------");//1.调用Map集合提供entrySet方法,把Map集合转换成键值对类型的Set集合Set<Map.Entry<String,Double>> entries = map.entrySet();for(Map.Entry<String,Double> entry: entries){//2.根据键值对类型的Set集合分别取出Map集合的键和值String key = entry.getKey();Double value = entry.getValue();System.out.println(key + "=======>" + value);}}
}
运行结果:
Lambda
- 需要用到Map的如下方法
方法名称 | 说明 |
---|---|
default void forEach(BiConsumer<? super K,? super V> action) | 结合Lambda遍历Map集合 |
实例演示
import java.util.HashMap;
import java.util.Map;
import java.util.function.BiConsumer;public class MapTraversal3 {public static void main(String[] args) {Map<String,Double> map = new HashMap<>();map.put("蜘蛛精",169.8);map.put("紫霞",165.8);map.put("至尊宝",169.5);map.put("牛魔王",183.6);System.out.println(map);System.out.println("-----------------------");
// map.forEach(new BiConsumer<String, Double>() {
// @Override
// public void accept(String k, Double v) {
// System.out.println(k + "=======>" + v);
// }
// });map.forEach( (k, v) -> System.out.println(k + "=======>" + v) );}
}
运行结果:
<Ctrl> + 鼠标左键点开forEach查看源码:
再查看 BiConsumer的源码,
它是有着函数式注解的函数式接口,所以可以通过Lambda表达式简化。
Map集合案例
需求与分析
需求
- 某个班级80名学生,现在需要组织秋游活动,班长提供了四个景点依次是(A、B、C、D),每个学生只能选择一个景点,请统计出最终哪个景点想去的人数最多。
分析
- 将80个学生选择的数据拿到程序中去,[A,A,B,A,B,C,D,...]
- 准备一个Map集合用于存储统计的结果,Map<String,Integer>,键是景点,值代表投票数量。
- 遍历80个学生选择的景点,每遍历一个景点,就看Map集合中是否存在该景点,不存在存入“景点=1”,存在则其对应值+1。
问题解决
import java.util.*;
import java.util.function.BiConsumer;public class MapCase1 {public static void main(String[] args) {//1.把80个学生选择的景点存入到集合中(采用随机存储)List<String> data = new ArrayList<>();
// String[] selects = {"A","B","C","D"};//自定义一下景点String[] selects = {"永庆坊","动物园","博物馆","彩虹桥"};Random r = new Random();for(int i = 1; i <= 80;i++){//每次模拟一个学生选择一个景点,存入到集合中去int index = r.nextInt(4); //0 1 2 3data.add(selects[index]);}System.out.println(data);System.out.println("-----------------------");//2.开始统计每个景点的投票人数//准备一个Map集合用于统计最终的结果Map<String,Integer> result = new HashMap<>();//3.开始遍历80个景点数据for(String s : data){//判断Map集合中是否存在该景点if(result.containsKey(s)){//存在,说明这个景点之后统计过,只需要给其值+1即可result.put(s,result.get(s) + 1);}else{//不存在,则说明这个景点是第一次统计,存入“景点 = 1”result.put(s,1);}}//4.查看Map集合System.out.println(result);//5.可以遍历一遍Map集合,输出最终的景点去向Set<String> keys = result.keySet();int max = 0,value = 0;String maxkey = "";for(String key:keys){value = result.get(key);if(value > max){max = value;maxkey = key;}}System.out.println("====最终景点去向====" + "\n" + maxkey + ":" + result.get(maxkey));}
}
运行结果:(不唯一)
需要存储一一对应的数据时,就可以考虑使用Map集合来做
END
学习自:黑马程序员——JavaSE课程