必要:
現在 2 つの選択コースがあります。各選択コースは何人かの学生が受講しています。各学生は選択コースの結果を持っています。2 つの選択コースを同時に受講した学生を見つける必要があります。まず、次に従って分割します。クラス番号の小さい方を先に出力し、各クラスを2つの選択科目の得点の合計で降順にソートし、得点が同じ場合は自学生の昇順にソートします番号。
説明を入力してください
最初の行は、最初の選択コースの学生のスコアです。
2 行目は、2 番目の選択コースの学生の成績です。データの各行の学生は英語のセミコロンで区切られています。各学生の学生番号と学年は英語のカンマで区切られています。学生番号の形式は 8 桁 (2 桁) です。学科番号 + 入学年度の下 2 桁 + 学科内の専攻番号 1 桁 + クラスの学生番号 3 桁)、学生成績の値の範囲は [0,100] から の値までの整数です。 2 つの選択コースを受講する学生の数 範囲は [1 ~ 2000] の整数です。
出力の説明
2つの選択科目を同時に履修した学生の学生番号 2つの選択科目を同時に履修した学生がいない場合はNULLが出力され、そうでない場合はクラスごとに振り分けられます。最小の番号が最初に出力され、各クラスのクラス番号(学生番号)が最初に出力されます(最初の 5 つ)、その後改行して、このクラスの 2 つの選択科目を履修している学生の学生番号を出力します学生番号は要件に応じてソートされ(2つの選択科目のスコアの合計が降順、スコアが同じ場合は昇順)、学生番号は英語のセミコロンで区切られます。
入力:
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;
}
}
効果: