LinkedList<Double> list = new LinkedList<Double>();
list.add(9.5);
list.add(4.9);
list.add(3.2);
list.add(4.9);
我想通过流计算列表中的重复元素,并将它们放入HashMap
,表示列表中每个数字的出现:
例如:(9.5 = 1,4.9 = 2,3.2 = 1)
有谁知道这是如何工作的。提前谢谢。
答案 0 :(得分:1)
使用Collections.frequency
列出所有不同的值,并为每个值使用Collections.frequency
方法计算它们的出现次数。然后收集到Map
Map<Double, Integer> result = list.stream()
.distinct()
.collect(Collectors.toMap(
Function.identity(),
v -> Collections.frequency(list, v))
);
使用Collectors.groupingBy
我认为它不如上面的例子那么好。
Map<Double, Integer> result2 = list.stream()
.collect(Collectors.groupingBy(Function.identity())) // this makes {3.2=[3.2], 9.5=[9.5], 4.9=[4.9, 4.9]}
.entrySet().stream()
.collect(Collectors.toMap(
Map.Entry::getKey,
e -> e.getValue().size())
);
普通for loop
plain for循环很短,你可能不需要stream和lambdas
Map<Double, Integer> map = new HashMap<>();
for(Double d : list)
map.put(d, map.containsKey(d) ? map.get(d)+1 : 1);
使用forEach
使用forEach更短
Map<Double, Integer> map = new HashMap<>();
list.forEach(d -> map.put(d, map.containsKey(d) ? map.get(d)+1 : 1));