原题
7-1 找到出勤最多的人
分数 10
全屏浏览题目
切换布局
作者 abc618382
单位 河北科技大学
根据教师的花名册,找到出勤最多的人。
输入格式:
出勤记录单行给出,数据直接使用空格分割。
输出格式:
单行输出(若有多人,人名直接使用空格分割,结尾处没有空格)。
输入样例:
在这里给出一组输入。例如:
zs ls ww ml zs ls ml zs ww
输出样例:
在这里给出相应的输出。例如:
zs
答案
import java.util.*;
public class Main {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
String name = sc.nextLine(); // 从输入中读取一行字符串
String[] names = name.split("\\s+"); // 将字符串按照空格或多个空格进行分割,得到一个字符串数组
HashMap<String, Integer> students = new HashMap<String, Integer>(); // 创建一个HashMap用于存储学生名字和出现次数
// 使用foreach循环遍历names数组,以name为key,以其出现次数为value,将其存入students中
for (String namestring : names) {
// students.getOrDefault(namestring, 0)表示当HashMap students中没有该namestring时,返回0;若有则返回其value
// 最后+1表示又被点到一次,将其放入students中
students.put(namestring, students.getOrDefault(namestring, 0) + 1);
}
// 调用Collections类中的max()方法找到students.values()返回的集合中的最大值
int max = Collections.max(students.values());
List<String> maxname = new ArrayList<String>(); // 创建一个列表用于存储出现次数最多的学生名字
// 使用foreach循环遍历students的键值对集合entrySet
for (Map.Entry<String, Integer> entry : students.entrySet()) {
if (entry.getValue() == max) {
maxname.add(entry.getKey()); // 如果某个学生的出现次数等于最大值,将其名字添加到maxname列表中
}
}
Iterator<String> iterator = maxname.iterator(); // 创建一个迭代器用于遍历maxname列表
int j = 0;
while (iterator.hasNext()) {
if (j == 0) {
System.out.print(iterator.next()); // 如果是第一个学生名字,直接输出
j = 1;
} else {
System.out.print(" " + iterator.next()); // 如果不是第一个学生名字,在前面加上空格后输出
}
}
}
}
为什么使用列表存储学生名字?
1. 因为列表(ArrayList)是一个动态大小的数据结构,可以根据需要自动扩展或缩小。在这个代码中,我们无法提前知道有多少个学生名字会出现次数最多,所以使用列表可以方便地添加和删除元素。
2. 列表保持元素的插入顺序,可以按照添加的顺序遍历和访问元素。在这个代码中,我们需要按照学生名字的顺序输出结果,所以使用列表可以确保输出的顺序是正确的。
键值对(key-value pair)是啥?
Map.Entry是一个接口,用于表示Map中的键值对(key-value pair)。它是Map接口的内部接口,用于表示Map中的每个元素。Map.Entry接口提供了获取键和值的方法,以及一些其他操作。
在这个代码中,Map.Entry<String, Integer>表示一个具体的键值对,其中String表示键的类型,Integer表示值的类型。通过使用Map.Entry<String, Integer>,我们可以访问和操作这个键值对的键和值。注:为什么在<String, Integer>中使用Integer而不是int?因为Integer是一个类而不是基本数据类型int,泛型不支持基本数据类型,只能使用类作为类型参数。
例如,可以使用entry.getKey()方法获取键,使用entry.getValue()方法获取值。在这段代码中,我们使用entry.getKey()获取学生名字,使用entry.getValue()获取学生出现的次数。
需要注意的是,Map.Entry是一个接口,不能直接实例化。它通常是通过Map的entrySet()方法返回的Set集合来获取键值对的实例。
ps: 关于泛型(Generics),在答案中,可以将以下代码改为
HashMap<String, Integer> students = new HashMap<String, Integer>();
如下
HashMap<String, Integer> students = new HashMap<>();
后面的<>将自动匹配前面的泛型 。