我有一个ArrayList
,其中包含字符串,例如列表1可能是名称列表:
Bill, Bill, Bill, Henry, Sue, Sue
如何使用Java流按排序顺序(按出现的顺序)如下返回数组?
Bill, Bill, Bill, Sue, Sue, Henry
很高兴知道如何显示的最终排名
Bill
,Sue
,Henry
。我有以下代码:
System.out.println(
name.stream()
.sorted(Comparator.comparing(a->a))
.collect(Collectors.toList())
);
其中name是数组。 它工作正常,并根据名称排列数组,但我也想介绍排名。
答案 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}