我想问一下如何通过应用比较器来实现以下结果:
输入:
4 //此班级列表中的学生人数
Student1 200 // [姓名] [得分]
学生2 200
学生3 100
学生4 300
输出:
Student1 2 // [名字] [等级]
学生2 2
学生3 4
学生4 1
*获得相同分数的学生将处于同一级别
`
public class Ranking {
private void run() {
Scanner sc = new Scanner(System.in);
int number = sc.nextInt();
Student [] studentArray = new Student [number];
for(int i=0;i<number;i++){
String name = sc.next();
int score = sc.nextInt();
studentArray [i] = new Student(name, score, 0);
}
getRanks(number, studentArray);
for(Student s: studentArray){
System.out.println(s);
}
}
public void getRanks(int number, Student [] studentArray){
int ranking = 1;
studentArray[0].setRank(ranking);
for(int i = 1; i<number; i++){
if(studentArray[i].getScore() != studentArray[i-1].getScore()){
ranking ++;
studentArray[i].setRank(ranking);
}
}
}
`
为什么不将数组转换为List然后运行
Collections.sort(studentList, new Comparator<Student>() {
public int compare(Student a, Student b) {
return a.getScore() - b.getScore();
}
});
之后,该列表中任何学生的索引将确定其排名。
您可以通过循环列表清除排名,并将排名直接关联到每个学生,如果最后得分等于当前,则不增加排名。
int lastScore = -1;
int rank = studentList.size() + 1;
for(Student s : studentList) {
if(s.getScore() > lastScore) {
rank—;
}
s.setRank(rank);
lastScore = s.getScore();
}
更新:根据列表中学生的索引设置排名:
int lastScore = -1;
int rank = studentList.size() + 1;
int displayRank = rank;
for(Student s : studentList) {
rank—;
if(s.getScore() > lastScore) {
displayRank = rank;
}
s.setRank(displayRank);
lastScore = s.getScore();
}
public class Ranking {
private void run() {
Scanner sc = new Scanner(System.in);
int number = sc.nextInt();
Student [] studentArray = new Student [number];
for(int i=0;i<number;i++){
String name = sc.next();
int score = sc.nextInt();
studentArray [i] = new Student(name, score, 0);
}
getRanks(number, studentArray);
for(Student s: studentArray){
System.out.println(s);
}
}
public void getRanks(int number, Student [] studentArray){
List<Student> studentList = Arrays.asList(studentArray);
Comparator<Student> comparator = new Comparator<Student>() {
public int compare(Student student1, Student student2) {
// for descending order
return student2.getScore() - student1.getScore();
}
};
Collections.sort(studentList, comparator);
int ranking = 1, displayRanking = 1;
studentList.get(0).setRank(displayRanking);
for(int i = 1; i<number; i++){
ranking++;
if(studentList.get(i).getScore() > studentList.get(i - 1).getScore()){
displayRanking = ranking;
}
studentList.get(i).setRank(displayRanking);
}
for(int i = 0; i<number; i++){
int index = sortedList.indexOf(studentArray[i]);
studentArray[i].setRank(sortedList.get(index).getRank);
}
}