如何按数字对列表进行排序,以及如果重复按字符串对列表进行排序?

时间:2019-11-05 20:14:00

标签: java sorting data-structures

我有以他们的名字命名的玩家(String name),还有恋人(int Lovers)。

每个玩家都有很多恋人。每个玩家都有一个唯一的名字。 我想要一种按数字对它们进行排序的方法,如果两个或多个玩家的恋人数相同,我希望按字母顺序对它们进行排序。

我考虑过使用MapHashmap

        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);

我发现这种方式对我的情况不是最佳选择。

我希望得到的是按多个恋人排序,如果多个恋人相等,那么我们将按名称字母顺序对其进行排序。

1 个答案:

答案 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());