【问题标题】:How to sort a list by number and if duplicated sort by string?如何按数字对列表进行排序,如果重复按字符串排序?
【发布时间】:2019-11-05 20:14:00
【问题描述】:

我有玩家以他们的名字命名(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);

我发现这种方式不适合我的情况。

我的期望是按恋人的数量排序,如果恋人的数量相等,那么我们按姓名字母顺序对它们进行排序。

【问题讨论】:

  • 您可以考虑将 player 封装到 class Player 中,其中包含 String nameList&lt;Player&gt; lovers 字段。然后你可以使用Collections.sort() 并传入一个自定义的Comparator。见mkyong.com/java/…

标签: java sorting data-structures


【解决方案1】:

使用 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());

【讨论】:

  • 这是否意味着我需要为每个玩家创建一个对象?如果是,还有其他方法吗?
  • 我这么说是因为球员的名字不固定。它可能是用户输入的。所以我不知道我需要多少个对象。
  • 我不知道,玩家数量的可变问题并不是什么大问题,我想,我调整了答案,还添加了一个修改版本的直接排序地图入口集- items-approach,只是避免在两者之间创建另一个可能会再次打乱排序顺序的映射。
猜你喜欢
  • 2023-04-08
  • 2018-10-12
  • 1970-01-01
  • 2021-06-10
  • 2012-04-03
  • 2014-02-13
  • 2021-07-08
  • 1970-01-01
  • 2020-06-13
相关资源
最近更新 更多