我有球员根据他们的名字命名(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);我发现这种方式对我的情况并不是最优的。
我期望的是按照情侣的数量进行排序,如果情侣的数量相等,那么我们就按姓名字母顺序对他们进行排序。
发布于 2019-11-06 04:26:34
使用java8Collections,它可能看起来像这样,但您可能想要创建一个建议的类,我只是将其作为一个接口。如果没有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的直接方法,但要避免创建另一个中介Map。就目前而言,中介可以做你想做的事情,但不能保证它的迭代顺序。目前,它实际上创建了一个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());https://stackoverflow.com/questions/58718772
复制相似问题