将参数传递给比较器 - Java

时间:2018-05-20 06:53:25

标签: java sorting

我有一个Comparator类,并在其compareTo方法中访问HashMap中的值。我想知道是否有办法将密钥的名称传递给compareTo方法。这是我的代码。例如,在此代码中,我想传递"racesWon"

public static Comparator<Player> RacesWon = new Comparator<Player>() {
    public int compare(Player p1, Player p2) {
        Integer p1GamesWon = Integer.valueOf(p1.stats.get("racesWon"));
        Integer p2GamesWon = Integer.valueOf(p2.stats.get("racesWon"));
        return p2GamesWon.compareTo(p1GamesWon);
    }
};

2 个答案:

答案 0 :(得分:5)

创建比较器有一种更简单的方法:

racesWon = Comparator.comparingInt(p -> Integer.valueOf(p.stats.get("racesWon")));

如果你想要一个基于给定键生成比较器的方法:

Comparator<Player> getComparator(String key) {
    return Comparator.comparingInt(p -> Integer.parseInt(p.stats.get(key)));
}

答案 1 :(得分:0)

来自匿名类的最简单的更改是使用变量:

String key = "racesWon";
Comparator<Player> RacesWon = new Comparator<Player>() {
    public int compare(Player p1, Player p2) {
        Integer p1GamesWon = Integer.valueOf(p1.stats.get(key));
        Integer p2GamesWon = Integer.valueOf(p2.stats.get(key));
        return p2GamesWon.compareTo(p1GamesWon);
    }
};

您必须小心,因为您的比较器可能会被钥匙卡住。创建上述比较器的最佳位置是设置密钥的方法。

有一些功能方法可以创建比较器,使您的代码更简洁:

String key = "racesWon";
Comparator<Player> c = 
    Comparator.comparingInt(p -> Integer.parseInt(p.stats.get(key)));

//yet another way:
Comparator<Player> ccc = 
    Comparator.comparing(player -> Integer.valueOf(player.stats.get(key)),
        Integer::compare);