首页 > 解决方案 > 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;
}

}

标签: javaarraylistcomparator

解决方案


为了保证比较元素对时的结果一致,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;
}

推荐阅读