Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/clojure/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java比较器的使用_Java_Comparator - Fatal编程技术网

Java比较器的使用

Java比较器的使用,java,comparator,Java,Comparator,我对java是相当陌生的,所以这个问题。我的任务是创建一个类检查器,它使用比较器desc对玩家进行排序。排序逻辑是按分数按降序对玩家进行排序,如果两个玩家的分数相同,则应首先出现名字按字典顺序较大的玩家 这是玩家级 class Player { String name; int score; } 比较器是这样调用的 Checker check=new Checker(); ................. Arrays.sort(Player,check.desc); 这

我对java是相当陌生的,所以这个问题。我的任务是创建一个类检查器,它使用比较器desc对玩家进行排序。排序逻辑是按分数按降序对玩家进行排序,如果两个玩家的分数相同,则应首先出现名字按字典顺序较大的玩家

这是玩家级

class Player
{
    String name;
    int score;
}
比较器是这样调用的

Checker check=new Checker();
................. 
Arrays.sort(Player,check.desc);
这就是我试过的

class Checker implements Comparator<Player>{

    public int compare(Player p1, Player p2){
        if(p1.score < p2.score) return 1;
        else if(p1.score > p2.score) return -1;
        else if(p1.score == p2.score){
            if(p1.name.compareTo(p2.name) < 0) return 1;
            else if(p1.name.compareTo(p2.name) > 0) return -1;
            else if (p1.name.compareTo(p2.name) == 0) return 0;
        }
    }
}
类检查器实现比较器{
公共整数比较(播放器p1、播放器p2){
如果(p1.scorep2.score)返回-1;
否则如果(p1.score==p2.score){
if(p1.name.compareTo(p2.name)<0)返回1;
else if(p1.name.compareTo(p2.name)>0)返回-1;
else if(p1.name.compareTo(p2.name)==0)返回0;
}
}
}

有人能帮我把它弄好吗。我真的不明白
desc
如何成为
checker
类的属性。

如果允许您在解决方案中使用
比较器,那么它实际上比您想象的要简单得多

Comparator<Player> playerSorted = Comparator
    .comparingInt(Player::getScore)
    .thenComparing(Player::getName)
    .reversed();

“我真的不明白desc如何成为checker类的属性。”如果不添加它,它就不是了。但是,如果您总是想按特定顺序(升序或降序)进行排序,则无需添加任何内容-只需使逻辑返回该固定顺序的正确值即可。我将比较器命名为desc,然后将其删除,因为我无法理解它。不要通过类播放器,而是传递包含players的列表这很优雅,但我受到如何在代码中实现它的限制。我需要实现一个comparator类。@Zeus我已经添加了一条注释,说明如何在您自己的类中使用它。我发现Player::score语法的编译错误。我不知道这是什么意思<代码>错误:“)”应为。比较(玩家::分数)。然后比较(玩家::名称);^Solution.java:6:错误:类型的非法开始。comparingit(Player::score)。然后比较(Player::name);^java:6:错误:';'应为。比较(玩家::分数)。然后比较(玩家::名称)@Zeus答案使用Java 8中引入的功能。看起来您使用的是早期版本的Java。
class Checker implements Comparator<Player> {
    private static final Comparator<Player> SORT_ASC = Comparator
        .comparingInt(Player::getScore).thenComparing(Player::getName);
    private static final Comparator<Player> SORT_DESC = SORT_ASC.reversed();

    private final boolean descending;

    public int compare(Player player1, Player player2) {
        Comparator<Player> sorter = descending ? SORT_DESC : SORT_ASC;
        return sorter.compare(player1, player2);
    }
}