现有两门选修课,每门选修课都有一部分学生选修,每个学生都有选修课的成绩,需要你找出同时选修了两门选修课的学生,先按照班级进行划分,班级编号小的先输出,每个班级按照两门选修课成绩和的降序排序,成绩相同时按照学生的学号升序排序。
输入描述
第一行为第一门选修课学生的成绩
第二行为第二门选修课学生的成绩,每行数据中学生之间以英文分号分隔,每个学生的学号和成绩以英文逗号分隔,学生学号的格式为8位数字(2位院系编号+入学年份后2位+院系内部1位专业编号+所在班级3位学号),学生成绩的取值范围为[0,100]之间的整数,两门选修课选修学生数的取值范围为[1-2000]之间的整数。
输出描述
同时选修了两门选修课的学生的学号,如果没有同时选修两门选修课的学生输出NULL,否则,先按照班级划分,班级编号小的先输出,每个班级先输出班级编号(学号前五位),然后另起一行输出这个班级同时选修两门选修课的学生学号,学号按照要求排序(按照两门选修课成绩和的降序,成绩和相同时按照学号升序),学生之间以英文分号分隔。
输入:
01202021,75;01201033,95;01202008,80;01203006,90;01203088,100
01202008,70;01203088,85;01202111,80;01202021,75;01201100,88
输出:
01202
01202008;01202021
01203
01203088
- ublic class SelectCourse {
- public static void main(String[] args) {
- Scanner scanner = new Scanner(System.in);
- //输入字符串数据
- String[] strs_1 = scanner.nextLine().split(";");
- String[] strs_2 = scanner.nextLine().split(";");
- //集合
- List
list1 = parseData(strs_1); - List
list2 = parseData(strs_2); - //集合
- Set
sets = new HashSet<>(); - //调用方法
- List
list =sameCourse(list1,list2,sets); - //sets排序,转换成List
- List
my =new ArrayList<>(sets); - Collections.sort(my);
-
- //调用排序方法
- getComparator(list,my);
-
- }
-
- /**
- * 1.获取学生信息
- *
- * @param strs
- * @return
- */
- private static List
parseData(String[] strs) { - List
list = new ArrayList<>(); - //循环
- for (int i = 0; i < strs.length; i++) {
- //分割字符串
- String[] ss = strs[i].split(",");
- //将对象添加集合中
- list.add(new Students(ss[0], Integer.parseInt(ss[1])));
- }
- return list;
- }
-
- /**
- * (2) 统计同时选修两门选修课的学生信息
- * @param list1 第一门选修课学生的成绩
- * @param list2 第二门选修课学生的成绩
- * @param sets 学号前五位
- * @return
- */
- public static List
sameCourse(List list1, List list2, Set sets) { - List
list = new ArrayList<>(); - //循环比较
- for (Students stu1 :
- list1) {
- for (Students stu2 :
- list2) {
- //判断学号是否相同
- if (stu1.getNo().equals(stu2.getNo())) {
- //累计成绩和
- int sum = stu1.getScore() + stu2.getScore();
- //添加到集合中
- list.add(new Students(stu1.getNo(), sum));
-
- //截取学号前五位-存入set集合中,过滤重复的
- String strNo = stu1.getNo().substring(0, 5);
- sets.add(strNo);
- }
- }
- }
- //判断如果没有,则返回NULL
- if (list.size() == 0) {
- System.out.println("NULL");
- }
- return list;
- }
-
- /**
- * (3) 学号按照要求排序(按照两门选修课成绩和的降序,成绩和相同时按照学号升序
- * @param list
- * @param sets
- */
- public static void getComparator(List
list,List sets) { - //外部排序
- Collections.sort(list,new Comparator
(){ - @Override
- public int compare(Students o1, Students o2) {
- //升序
- return Integer.valueOf(o1.getNo())-Integer.valueOf(o2.getNo());
- }
- });
-
- //输出信息
- for (String str:
- sets) {
- System.out.println(str);
- //对象
- StringBuilder builder=new StringBuilder();
- //循环
- for (Students lls:
- list) {
- //是否相等
- if(str.equals(lls.getNo().substring(0,5))){
- builder.append(lls.getNo()).append(";"); //添加
- }
- }
- System.out.println(builder.toString());
- }
- }
-
-
-
- }
-
- //学生类
- class Students {
- private String no;
- private int score;
-
- .....setXXX and getXXX......
-
- public Students(String no, int score) {
- this.no = no;
- this.score = score;
- }
-
- @Override
- public String toString() {
- return no + "=>" + score;
- }
- }

