【发布时间】:2016-01-18 16:46:06
【问题描述】:
我可以collect a list of words into a bag(又名多集):
Map<String, Long> bag =
Arrays.asList("one o'clock two o'clock three o'clock rock".split(" "))
.stream()
.collect(Collectors.groupingBy(Function.identity(), Collectors.counting()));
但是,不保证包中的条目按任何特定顺序排列。例如,
{rock=1, o'clock=3, one=1, three=1, two=1}
我可以将它们放入一个列表中,然后使用我的值比较器实现对它们进行排序:
ArrayList<Entry<String, Long>> list = new ArrayList<>(bag.entrySet());
Comparator<Entry<String, Long>> valueComparator = new Comparator<Entry<String, Long>>() {
@Override
public int compare(Entry<String, Long> e1, Entry<String, Long> e2) {
return e2.getValue().compareTo(e1.getValue());
}
};
Collections.sort(list, valueComparator);
这给出了预期的结果:
[o'clock=3, rock=1, one=1, three=1, two=1]
有没有更优雅的方法来做到这一点?相信很多人都已经解决了这个问题。我可以使用 Java Streams API 中内置的东西吗?
【问题讨论】:
-
查看 Pattern.splitAsStream。
-
谢谢@Brian。我不知道 Pattern.splitAsStream 方法。
标签: java java-8 java-stream