需求:
现有两门选修课,每门选修课都有一部分学生选修,每个学生都有选修课的成绩,需要你找出同时选修了两门选修课的学生,先按照班级进行划分,班级编号小的先输出,每个班级按照两门选修课成绩和的降序排序,成绩相同时按照学生的学号升序排序。
输入描述
第一行为第一门选修课学生的成绩
第二行为第二门选修课学生的成绩,每行数据中学生之间以英文分号分隔,每个学生的学号和成绩以英文逗号分隔,学生学号的格式为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<Students> list1 = parseData(strs_1);
List<Students> list2 = parseData(strs_2);
//集合
Set<String> sets = new HashSet<>();
//调用方法
List<Students> list =sameCourse(list1,list2,sets);
//sets排序,转换成List
List<String> my =new ArrayList<>(sets);
Collections.sort(my);
//调用排序方法
getComparator(list,my);
}
/**
* 1.获取学生信息
*
* @param strs
* @return
*/
private static List<Students> parseData(String[] strs) {
List<Students> 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<Students> sameCourse(List<Students> list1, List<Students> list2, Set<String> sets) {
List<Students> 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<Students> list,List<String> sets){
//外部排序
Collections.sort(list,new Comparator<Students>(){
@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;
}
}
效果: