JavaSE——集合框架二(4/6)-Map集合的遍历方式(键找值,键值对,Lambda)、Map集合案例(需求与分析,问题解决)

目录

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课程

  • 2
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值