我有以他们的名字命名的玩家(String name
),还有恋人(int Lovers
)。
每个玩家都有很多恋人。每个玩家都有一个唯一的名字。 我想要一种按数字对它们进行排序的方法,如果两个或多个玩家的恋人数相同,我希望按字母顺序对它们进行排序。
我考虑过使用Map
和Hashmap
。
Map<String, Integer> Players= new HashMap<>();
Players.put("Christiano Ronaldo",10);
Players.put("Messi",50);
Players.put("Kaka",10);
Players.put("Ronaldinho",100);
List sortedKeys=new ArrayList(Players.keySet());
Collections.sort(sortedKeys);
我发现这种方式对我的情况不是最佳选择。
我希望得到的是按多个恋人排序,如果多个恋人相等,那么我们将按名称字母顺序对其进行排序。
答案 0 :(得分:0)
使用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());