目录
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 3
data.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课程