Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/mongodb/13.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
使用java流对数组列表中的数据进行排序_Java_Java Stream - Fatal编程技术网

使用java流对数组列表中的数据进行排序

使用java流对数组列表中的数据进行排序,java,java-stream,Java,Java Stream,我有一个包含字符串的ArrayList,例如,列表1可能是一个名称列表: 比尔,比尔,比尔,亨利,苏,苏 如何使用java streams按排列顺序(按出现次数)返回如下数组? Bill,Bill,Bill,Sue,Sue,Henry 知道如何显示最终的排名也很好 比尔,苏,亨利。我有以下代码: System.out.println( name.stream() .sorted(Comparator.comparing(a->a)) .collect(Co

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

比尔,比尔,比尔,亨利,苏,苏

如何使用java streams按排列顺序(按出现次数)返回如下数组?

Bill,Bill,Bill,Sue,Sue,Henry

知道如何显示最终的排名也很好
比尔
亨利
。我有以下代码:

System.out.println(
   name.stream()
       .sorted(Comparator.comparing(a->a))
       .collect(Collectors.toList())
);
其中name是数组。
它工作得很好,并根据名称排列数组,但我还想介绍排名。

首先,有点不清楚您实际想要实现什么:一个
列表
列表
或一个
字符串[]

一方面你想要
比尔,比尔,比尔,苏,苏,亨利
,但是如果你的列表是
{Bill,Bill,Bill,苏,亨利};{Bill,Gene,Sue}
在这种情况下,你会有什么结果?单个
字符串[]
或。。。。到底是什么?您还提到如何显示比尔、苏、亨利的最终排名,这显然意味着完全不同的东西

无论如何:

Shmosel解决方案在评论中确实很不错!(但假设有两件事,列表是可编辑的,因此可以对其进行排序,并且需要排序的列表而不是数组)。您不能将其重构为一个返回数组的单一流操作,因为这意味着要使用两次流。。。你不能

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

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);
如果要对每个列表进行排序,则可以使用:

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

这不是我自己的答案,我将只考虑重构

最终列表名称=;
最终映射namesbyoccurrence=names.stream()
.collect(收集器.groupingBy(
Function.identity(),
3.计数()
));
final Comparator byOccurrence=Comparator.comparing(namesbyoccurrence::get);
最终字符串[]res=names.stream()
.sorted(按发生率.reversed())
.toArray(字符串[]::新建);

以下是如何包括排名:

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);
List l=array.asList(“比尔”、“比尔”、“比尔”、“亨利”、“苏”、“苏”);
Map m=l.stream().collect(Collectors.groupingBy(x->x,Collectors.counting());
系统输出打印项次(m);
结果是:
{Sue=2,Bill=3,Henry=1}

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

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

为什么要使用流?只需
name.sort()就可以了。然后打印列表。(顺便说一句,ArrayList不是数组,它是一个列表)
names.sort(Comparator.comparing(names.stream().collect(Collectors.groupingBy(x->x,Collectors.counting())::get.reversed())@shmosel你能补充一下吗?起初,我认为一次又一次地流式传输列表对性能有很大的影响。我认为最好先分组,然后将生成的映射和平面映射流到列表中。但是您对方法引用的使用阻止了重新流式传输,并且所有语句都在一个语句中。。。很好@Eugene不需要返回数组。虽然OP在开头说“我有一个ArrayList”,但在结尾说“where name is array”,但由于OP在代码示例中使用了“
name.stream()
”,它似乎是一个
ArrayList,而不是一个数组,因此允许进行适当排序。就像shmosel的评论一样。@shmosel好的,我是。我误解了。我认为
::get
。get
。我更喜欢这个解决方案,因为比较器不需要反复迭代列表来检查频率。不过,对于在列表和数组之间进行转换的解释,还是请大家竖起大拇指。
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);
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);
names.stream()
        .collect(Collectors.groupingBy(x -> x))
        .values()
        .stream()
        .sorted(Comparator.comparingInt(List::size).reversed())
        .flatMap(List::stream)
        .collect(Collectors.toList())