package com.rep.str;
import com.sun.xml.internal.ws.server.ServerRtException;
import java.util.*;
/*
有两门选修课,每门选修课都有一部分学生选修,每个学生都有选修课的成绩,
需要你找出同时选修了两门选修课的学生,
先按照班级进行划分,班级编号小的先输出
,每个班级按照两门选修课成绩和的降序排序,成绩相同时按照学生的学号升序排序。
*/
public class XuanXiu {
public static class Student {
String cNo;
String sNo;
int scoreCs1 = -1;
int scoreCs2 = -1;
public int getSum() {
return scoreCs1 + scoreCs2;
}
}
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
String s1 = scanner.nextLine();
String s2 = scanner.nextLine();
getResult(s1, s2);
}
public static void getResult(String s1, String s2) {
/*
s1
01202021,75;01201033,95;01202008,80;01203006,90;01203088,100
s2
01202008,70;01203088,85;01202111,80;01202021,75;01201100,88
*/
HashMap<String, Student> students = new HashMap<>();
divide(s1, 1, students);
divide(s2, 2, students);
// 查看是否有两个得分
Student[] suits = students.values().stream().filter(
student -> student.scoreCs2 != -1 && student.scoreCs1 != -1
).toArray(Student[]::new);
if (suits.length == 0) {
System.out.println("NULL");
return;
}
/*
结果
01202 班级号
01202008;01202021 学号
01203
01203088
*/
HashMap<String, ArrayList<Student>> resp = new HashMap<>();
for (Student student : suits) {
resp.putIfAbsent(student.cNo, new ArrayList<>());
resp.get(student.cNo).add(student);
}
// 排序
resp.keySet().stream().sorted().forEach(
/*
先按照班级进行划分,班级编号小的先输出
,每个班级按照两门选修课成绩和的降序排序,成绩相同时按照学生的学号升序排序。
*/
cNo -> {
System.out.println(cNo);
ArrayList<Student> studentList = resp.get(cNo);
studentList.sort((stu1, stu2) -> {
int stu1Score = stu1.getSum();
int stu2Score = stu2.getSum();
return stu1Score - stu2Score;
});
//输出学号
StringBuilder stringBuilder = new StringBuilder();
for (Student student : studentList) {
stringBuilder.append(student.sNo + ";");
}
stringBuilder.deleteCharAt(stringBuilder.length() - 1);
System.out.println(stringBuilder);
}
);
}
public static void divide(String str, int corseNo, Map<String, Student> map) {
String[] stus = str.split(";");
for (String stu : stus) {
int score = Integer.parseInt(stu.split(",")[1]);
String cNo = stu.split(",")[0].substring(0, 5);// 班级号
String sNo = stu.split(",")[0];// 学号
map.putIfAbsent(sNo, new Student());
Student student = map.get(sNo);
student.sNo = sNo;
student.cNo = cNo;
if (corseNo == 1) {
student.scoreCs1 = score;
} else {
student.scoreCs2 = score;
}
}
}
}