我有一个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);
}
};
答案 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);