【问题标题】:How to sort List<List<String>> by first element of every list?如何按每个列表的第一个元素对 List<List<String>> 进行排序?
【发布时间】:2019-12-02 17:37:53
【问题描述】:

如何按每个列表的第一个元素对列表列表进行排序?我有这样的清单:

[angel, angle, galen, glean, lange]
[abel, able, bale, bela, elba]
[elan, lane, lean, lena, neal]
[caret, carte, cater, crate, trace]
[evil, levi, live, veil, vile]
[alger, glare, lager, large, regal]

我想

[abel, able, bale, bela, elba]
[alger, glare, lager, large, regal]
[angel, angle, galen, glean, lange]
[caret, carte, cater, crate, trace]
[elan, lane, lean, lena, neal]
[evil, levi, live, veil, vile]

如何使用 Stream 做到这一点?

这是我的代码:

List<List<String>> lis = new ArrayList();

stream.collect(Collectors.groupingBy(s -> getAnagramKey(s)))
    .values().stream()
    .sorted(Collections.reverseOrder(Comparator.comparingInt(List::size)))
    .limit(15)
    .forEach(e -> {
    lis.add(e);
 });

final int maxSize = lis.stream().map(List::size).max(Integer::compare).orElse(0);

lis.stream()
    .filter(e -> e.size() == maxSize)
    .forEach(System.out::println
);

【问题讨论】:

  • 你的代码有什么问题?
  • 既然你已经知道collect,你可以在第一个流管道中用add去掉forEach。您没有提到,maxSize 在这个问题中的相关性是什么。

标签: java sorting java-stream


【解决方案1】:

您可以为此致电Comparator.comparing

List<List<String>> sortedList = 
    lis.stream().sorted(Comparator.comparing(x -> x.get(0)))
        .collect(Collectors.toList());

如果您只想对列表进行适当的排序,则不需要流。 List.sort 将完成这项工作:

lis.sort(Comparator.comparing(x -> x.get(0)));

另外,不要使用原始类型。写ArrayList&lt;&gt;,而不是ArrayList

List<List<String>> lis = new ArrayList<>();

【讨论】:

  • 在执行get(0)的行中,在排序操作之前添加.filter(l -&gt; !l.isEmpty())可能就足够安全了。
猜你喜欢
  • 2021-09-15
  • 2019-03-28
  • 1970-01-01
  • 2016-01-08
  • 1970-01-01
  • 2017-11-02
  • 2021-02-14
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多