Comparator如何在内部使用ArrayList?(如何跟踪工作在w.r.t Arraylist中的比较器)

时间:2018-06-05 20:03:23

标签: java arraylist comparator

任何人都可以解释一下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;
}

}

1 个答案:

答案 0 :(得分:1)

为了在比较元素对a, bb, 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;
}