使用Java流在数组列表中对数据进行排名

时间:2018-07-27 01:29:34

标签: java java-stream

我有一个ArrayList,其中包含字符串,例如列表1可能是名称列表:

Bill, Bill, Bill, Henry, Sue, Sue

如何使用Java流按排序顺序(按出现的顺序)如下返回数组?

Bill, Bill, Bill, Sue, Sue, Henry

很高兴知道如何显示的最终排名 BillSueHenry。我有以下代码:

System.out.println(
   name.stream()
       .sorted(Comparator.comparing(a->a))
       .collect(Collectors.toList())
);

其中name是数组。 它工作正常,并根据名称排列数组,但我也想介绍排名。

4 个答案:

答案 0 :(得分:1)

首先,您实际上想要实现的目标有点不清楚:List<List<String>>List<String[]>String[] ...

您想要一只手Bill, Bill, Bill, Sue, Sue, Henry,但是如果您的清单是{Bill, Bill, Bill, Sue, Henry, Henry}; {Bill, Gene, Sue},那么在这种情况下您的结果如何?单个String[]或....到底是什么?您还提到了如何显示Bill,Sue,Henry的最终排名,这显然意味着完全其他...

无论如何:

在评论中使用Shmosel解决方案确实非常好! (但假设有两件事,您的列表是可编辑的,因此您可以对其进行排序,并且希望使用排序后的List而不是数组)。而且,您不能将其重构为返回数组的单个流操作,因为这将意味着两次消耗流...这是您无法做到的。

您可以通过以下两种操作来完成此操作:

List<String> flat = all.stream()
            .flatMap(List::stream)
            .collect(Collectors.toList());

    String[] result = flat.stream()
            .sorted(Comparator.comparing(x -> Collections.frequency(flat, x)).reversed())
            .toArray(String[]::new);

对于上面我输入的内容,这将是:

[Bill, Bill, Bill, Bill, Henry, Henry, Sue, Sue, Gene]

如果要对每个列表进行排序,则可以使用:

 List<List<String>> res = all.stream()
            .map(x -> x.stream()
                    .sorted(Comparator.comparing(y -> Collections.frequency(x, y)).reversed())
                    .collect(Collectors.toList()))
            .collect(Collectors.toList());

结果将是:

 [[Bill, Bill, Bill, Henry, Henry, Sue], [Bill, Gene, Sue]]

答案 1 :(得分:1)

这不是我自己的答案,我只考虑shmosel's comment重构Eugene's remarks

final List<String> names = <your names here>;

final Map<String, Long> namesByOccurence = names.stream()
    .collect(Collectors.groupingBy(
        Function.identity(),
        Collectors.counting()
    ));

final Comparator<String> byOccurrence = Comparator.comparing(namesByOccurence::get);

final String[] res = names.stream()
    .sorted(byOccurrence.reversed())
    .toArray(String[]::new);

答案 2 :(得分:1)

另一种解决方案是对它们进行分组,然后按大小对组进行排序,然后对平面图进行排序:

names.stream()
        .collect(Collectors.groupingBy(x -> x))
        .values()
        .stream()
        .sorted(Comparator.comparingInt(List::size).reversed())
        .flatMap(List::stream)
        .collect(Collectors.toList())

答案 3 :(得分:0)

您可以在其中添加排名:

List<String> l = Arrays.asList("Bill", "Bill", "Bill", "Henry", "Sue", "Sue");

    Map<String, Long> m = l.stream().collect(Collectors.groupingBy(x -> x, Collectors.counting()));
    System.out.println(m);

结果是: {Sue = 2,Bill = 3,Henry = 1}