java实战(第六篇):统计投票信息
一.需求分析
需求:某个班级80名学生,现在需要组织春游活动,班长以此提供了四个景点A B C D,每个学生只能选择一个景点,请统计最终想去哪个景点的人最多。
很明显我们这个案例需要存储一对一的数据,就需要考虑使用map集合来做。map集合内存放的都是一对一的键值对。
二.源码思路分析
package maptest;import java.util.*;public class test {public static void main(String[] args) {calc();}private static void calc() {//1.产生80个学生选择的景点数据拿到程序中,用随机数进行模拟。List<String> locations = new ArrayList<>();String[] names = {"玉龙雪山","长城","少林寺","丽江"};Random r = new Random();for (int i = 0; i < 80; i++) {int index = r.nextInt(names.length);//0,1,2,3locations.add(names[index]);}//2.统计每个景点被选择的次数//创建一个Map集合,key为景点名称,value为景点被选择的次数Map<String,Integer> map = new HashMap<>();//一行创建map集合的经典代码for (String location : locations) {//判断map集合中是否有这个景点if(map.containsKey(location)){//如果有这个景点,就让这个景点对应的value值加1Integer count = map.get(location);map.put(location,count+1);}else{//如果没有这个景点,就添加这个景点,value值初始化为1map.put(location,1);}}//3.遍历map集合,将结果打印出来(只需要打印最后的结果,每个景点被选择的次数)map.forEach((k,v)-> System.out.println(k+"被选择"+v+"次"));//4.找到哪个景点选择人数最多,并打印出来for (Map.Entry<String, Integer> entry : map.entrySet()) {if(entry.getValue()==Collections.max(map.values())){System.out.println("选择人数最多是:"+entry.getKey());}if(entry.getValue()==Collections.min(map.values())){System.out.println("选择人数最少是:"+entry.getKey());}}}
}
下面我来讲解一下这篇代码:
一.先讲解注释1.
我们首先需要产生80个学生选择的景点数据,我们用到了arraylist这个集合,同样是用到了多态的思想:Arraylist为List提供了接口的具体实现,同时将这个集合内的数据固定为String类型,接着添加四个景点,引入随机数遍历这个字符串names,遍历到的数据加入到集合locations中。
二.接着讲解注释2.
首先创建一个Map集合,key为景点名称,value为景点被选择的次数,其中固定key类型为String,value类型为Integer,增强for循环遍历map集合,再给读者讲解一下这里的for循环,locations这个集合已经固定类型为String,location是创建的遍历对象。后面进行if判断。
三.讲解注释3.
这是一个map集合的功能,调用forEach功能遍历,k代表key,v代表value。
四.最后讲解注释4.
首先通过map.entrySet()获取所有键值对,在遍历过程中,用Collections.max()和Collections.min()实时计算全局最大/最小值,再通过==比较当前景点的选择次数是否等于极值,若匹配则输出结果。