Используя java 8 Collections, это может выглядеть так, но вы можете создать класс так, как было предложено, я просто набросал его как интерфейс. Без Comparator
эта вложенная сортировка может стать довольно неприятной.
interface Player{
Integer getLovers();
public String getName();
}
List<Player> sorted = players.entrySet()
.stream()
.map(i -> new Player(i.getKey(), i.getValue()))
.sorted(Comparator.comparing(Player::getLovers).thenComparing(Player::getName))
.collect(Collectors.toList());
Если вы хотите иметь только список имен, вы можете отобразить его:
List<String> names = sorted.stream()
.map(Player::getName)
.collect(Collectors.toList());
Вы также можетевозьмите прямой подход @ Deadpool, но избегайте создания другой промежуточной карты. На данный момент посредник может просто делать то, что вы хотите, но нет гарантии для его порядка итерации. На данный момент он фактически создает LinkedHashMap
, который сохраняет порядок, но это не гарантирует, что он останется таким же навсегда, если реализация потоковой передачи изменится.
List<String> names = players.entrySet().stream()
.sorted(Comparator.comparing(Map.Entry<String, Integer>::getValue)
.thenComparing(Map.Entry<String, Integer>::getKey))
.map(Map.Entry::getKey)
.collect(Collectors.toList());