Передача аргумента в компаратор - Java - PullRequest
0 голосов
/ 20 мая 2018

У меня есть класс 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 голосов
/ 20 мая 2018

Самое простое изменение в вашем анонимном классе - использование переменной:

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);
0 голосов
/ 20 мая 2018

Существует гораздо более простой способ создания компаратора:

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)));
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...