首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何按数字排序列表,如果重复则按字符串排序?

如何按数字排序列表,如果重复则按字符串排序?
EN

Stack Overflow用户
提问于 2019-11-06 04:14:00
回答 1查看 63关注 0票数 1

我有球员根据他们的名字命名(String name),我有恋人(int Lovers)。

每个玩家都有许多情侣。每个玩家都有一个唯一的名字。我想要一种方法来排序他们的号码,如果两个或更多的玩家有相同数量的情侣,我希望他们按字母顺序排序。

我考虑过使用MapHashmap

代码语言:javascript
复制
        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);

我发现这种方式对我的情况并不是最优的。

我期望的是按照情侣的数量进行排序,如果情侣的数量相等,那么我们就按姓名字母顺序对他们进行排序。

EN

回答 1

Stack Overflow用户

发布于 2019-11-06 04:26:34

使用java8Collections,它可能看起来像这样,但您可能想要创建一个建议的类,我只是将其作为一个接口。如果没有Comparator,这种嵌套的排序工作可能会变得相当糟糕。

代码语言:javascript
复制
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());

如果您只想拥有名称列表,您可以映射它:

代码语言:javascript
复制
List<String> names = sorted.stream()
            .map(Player::getName)
            .collect(Collectors.toList());

您也可以采用@Deadpool的直接方法,但要避免创建另一个中介Map。就目前而言,中介可以做你想做的事情,但不能保证它的迭代顺序。目前,它实际上创建了一个LinkedHashMap,它保持了顺序,但如果流实现发生变化,不能保证永远保持这种状态。

代码语言:javascript
复制
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());
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/58718772

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档