任何人都可以解释一下comaprator内部如何使用ArrayList吗? 我的代码正在运行,但我没有了解内部事务的处理方式。
**程序定义:**按照得分的降序排序名称,如果两个得分相等则按字母顺序显示名称。
import java.util.Arrays;
import java.util.Comparator;
import java.util.Scanner;
public class Solution {
public static void main(String[] args) {
Scanner scan = new Scanner(System.in);
int n = scan.nextInt();
Player[] player = new Player[n];
Checker1 checker1 = new Checker1();
for(int i = 0; i < n; i++){
player[i] = new Player(scan.next(), scan.nextInt());
}
scan.close();
Arrays.sort(player, checker1);
for(int i = 0; i < player.length; i++){
System.out.printf("%s %s\n", player[i].name, player[i].score);
}
}
}
class Checker1 implements Comparator<Player> {
@Override
public int compare(Player p1, Player p2) {
String s1=(String)p1.name;
String s2=(String)p2.name;
// TODO Auto-generated method stub
System.out.println(p1.score+"..."+p2.score);
if(p1.score>p2.score){
return -1;
}
else if(p1.score==p2.score){
return s1.compareTo(s2);
}
return 0;
}
}
答案 0 :(得分:1)
为了在比较元素对a, b
和b, a
时确保一致的结果,比较操作需要保持一致,此处if p1.score < p2.score
返回0
。但是,如果它更大,则返回-1
。这违反了总合同;在许多情况下,Java希望能够以任何顺序比较元素。最好使用Integer.compare(int, int)
并仅在0
时返回比较名称的结果。像,
@Override
public int compare(Player p1, Player p2) {
System.out.println(p1.score + "..." + p2.score);
int c = Integer.compare(p1.score, p2.score);
if (c == 0) {
return p1.name.compareTo(p2.name);
}
return c;
}