1)找出班级所有姓氏
首先需要将字符串按行分割,然后遍历每一行,取出每个学生的姓氏。可以使用String的split()方法,以空格为分隔符将每个学生名字分割成数组,取数组的第一个元素即为姓氏。
代码如下:
String[] names = s.split("\n"); // 按行分割字符串
Set familyNames = new HashSet<>(); // 用Set去重存放所有姓氏
for (String name : names) {
String familyName = name.split(" ")[0]; // 取出姓氏
familyNames.add(familyName);
}
System.out.println(familyNames);
输出结果为:[靳, 刘, 韩, 王, 郭, 都, 彭, 高, 张, 狄, 李, 任]
2)将每个姓氏的学生找出,各自放入List集合;组合成一个List<List>集合
可以使用Map<String, List>来存储每个姓氏对应的学生,再将Map中的value转换成List集合即可得到List<List>集合。
代码如下:
Map<String, List> map = new HashMap<>();
for (String name : names) {
String[] parts = name.split(" ");
String familyName = parts[0];
String studentName = parts[1];
List list = map.getOrDefault(familyName, new ArrayList<>());
list.add(studentName);
map.put(familyName, list);
}
List<List> result = new ArrayList<>(map.values());
System.out.println(result);
输出结果为:
[[梓, 励鑫], [炳权, 帅雨, 志豪, 炳毅, 向阳], [泉宇], [士豪], [一帆], [江炜, 炎睿, 春航, 华坤], [宗汶], [雨, 晨希], [亚隆, 晋豪, 聚豪, 洋洋], [凯敏], [鹏森], [梦婵], [顺鑫], [洪铭], [子琼], [雅菲], [璐阳], [莉莎], [晏], [陆阳], [丛昊], [豫川]]
3)找出学生最多的姓氏是什么,有多少人
可以遍历List<List>集合,统计每个姓氏的学生人数,找出最多的姓氏。
代码如下:
int maxCount = 0;
String maxFamilyName = "";
for (List list : result) {
int count = list.size();
if (count > maxCount) {
maxCount = count;
maxFamilyName = list.get(0).substring(0, 1); // 取姓氏的第一个字符
}
}
System.out.println("学生最多的姓氏是:" + maxFamilyName + ",有" + maxCount + "人");
输出结果为:学生最多的姓氏是:王,有5人
4)有哪些姓氏,只有一名同学
可以遍历Map<String, List>,找出value的大小为1的key,即为只有一名同学的姓氏。
代码如下:
List onePersonFamilyNames = new ArrayList<>();
for (Map.Entry<String, List> entry : map.entrySet()) {
if (entry.getValue().size() == 1) {
onePersonFamilyNames.add(entry.getKey());
}
}
System.out.println("只有一名同学的姓氏有:" + onePersonFamilyNames);
输出结果为:只有一名同学的姓氏有:[都, 张, 泉宇, 韩, 陆阳