java - Comparator 如何在内部与 ArrayList 一起工作?(如何跟踪工作于 Arraylist 的比较器)
问题描述
谁能解释一下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;
}
}
解决方案
为了保证比较元素对时的结果一致,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;
}
推荐阅读
- java - 如何从嵌套的 HashMaps 中检索键而不是其值
- wpf - WPF/ReactiveUI 应用程序中的 ReactiveCommand 阻塞 UI 线程
- javascript - AngularJS路由不会页面
- svn - 使用 TortoiseSVN 和 Visual Studio Code,我如何将一些无序的更改从 dev 分支合并到 stage 分支?
- kubernetes - 将 alertmanager 添加到 istio prometheus
- python - 我创建了一个猜谜游戏,但我不明白为什么我的 -= 命令功能不起作用
- docker - Docker COPY 没有复制脚本
- c# - 如何在控制器外部使用 Startup.cs 上声明的服务
- mysql - MYSQL - 获取组中未通过条件测试的项目列表
- kubernetes - `operator-courier verify` 希望我更新的 CRD 的根列表在哪里?