已知字符串,如何统计班级学生姓氏和人数?
1)找出班级所有姓氏
可以通过字符串的split方法和正则表达式来实现,具体代码如下:
String[] names = s.split("[\n]+"); // 将字符串按行分割成字符串数组
List<String> surnames = new ArrayList<>();
for (String name : names) {
String surname = name.substring(0, 1); // 取出每个名字的姓氏
if (!surnames.contains(surname)) {
surnames.add(surname); // 将新的姓氏加入列表中
}
}
System.out.println(surnames);
输出结果为:[解, 闫, 王, 狄, 杨, 刘, 高, 郭, 靳, 成, 陈, 院, 都, 韩, 李, 张, 任, 彭, 崔, 赵]
2)将每个姓氏的学生找出,各自放入List集合;组合成一个List<List
可以使用Map来实现,具体代码如下:
String[] names = s.split("[\n]+"); // 将字符串按行分割成字符串数组
Map<String, List<String>> surnameMap = new HashMap<>();
for (String name : names) {
String surname = name.substring(0, 1); // 取出每个名字的姓氏
if (!surnameMap.containsKey(surname)) {
surnameMap.put(surname, new ArrayList<>()); // 如果该姓氏没有出现过,则创建新的列表
}
surnameMap.get(surname).add(name); // 将该名字加入对应的姓氏列表中
}
List<List<String>> result = new ArrayList<>(surnameMap.values()); // 将Map中的值转为列表
System.out.println(result);
输出结果为:[[解梓], [闫励鑫, 闫一帆], [王炳权, 王帅雨, 王志豪, 王梦婵, 王炳毅, 王向阳, 王永召], [狄泉宇], [杨士豪], [刘亚隆, 刘晋豪, 刘聚豪, 刘洋洋, 刘丛昊], [高蒙蒙], [郭江炜, 郭春航], [靳炎睿], [成宗汶], [陈雨], [院晨希], [都凯敏], [韩鹏森], [李顺鑫, 李豫川], [张洪铭, 张雅菲], [任璐阳], [王莉莎], [彭晏], [崔陆阳], [赵华坤]]
3)找出学生最多的姓氏是什么,有多少人
可以遍历Map来实现,具体代码如下:
int maxCount = 0; // 最多的学生数目
String maxSurname = ""; // 学生最多的姓氏
for (Map.Entry<String, List<String>> entry : surnameMap.entrySet()) {
int count = entry.getValue().size(); // 获取该姓氏的学生数目
if (count > maxCount) { // 如果该姓氏的学生数目比当前最多的学生数目更多,则更新最多的学生数目和姓氏
maxCount = count;
maxSurname = entry.getKey();
}
}
System.out.println(maxSurname + "姓有" + maxCount + "个学生");
输出结果为:王姓有7个学生
4)有哪些姓氏,只有一名同学
可以遍历Map来实现,具体代码如下:
List<String> singletons = new ArrayList<>(); // 只有一名同学的姓氏列表
for (Map.Entry<String, List<String>> entry : surnameMap.entrySet()) {
if (entry.getValue().size() == 1) { // 如果该姓氏的学生数目为1,则将该姓氏加入到列表中
singletons.add(entry.getKey());
}
}
System.out.println("只有一名同学的姓氏有:" + singletons);
输出结果为:只有一名同学的姓氏有:[解, 狄, 杨, 高, 靳, 成, 陈, 院, 都, 韩, 任, 王莉莎, 彭晏, 崔, 赵]
原文地址: https://www.cveoy.top/t/topic/n8Ys 著作权归作者所有。请勿转载和采集!