LinkedList<Double> list = new LinkedList<Double>(); list.add(9.5); list.add(4.9); list.add(3.2); list.add(4.9);
我想通过一个流来计算列表中重复的元素,并将它们放入一个HashMap中,HashMap表示列表中每个数字的出现次数:例如:(9.5=1,4.9=2,3.2=1)有人知道这是怎么工作的吗?
HashMap
sulc1iza1#
使用Collections.frequency
Collections.frequency
创建一个所有非重复值的列表,并使用Collections.frequency方法计算每个值的出现次数。
Map<Double, Integer> result = list.stream() .distinct() .collect(Collectors.toMap( Function.identity(), v -> Collections.frequency(list, v)) );
使用Collectors.groupingBy
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
for loop
简单的for循环相当短,可能不需要流和lambda
Map<Double, Integer> map = new HashMap<>(); for(Double d : list) map.put(d, map.containsKey(d) ? map.get(d)+1 : 1);
使用forEach
forEach
使用forEach时甚至更短
Map<Double, Integer> map = new HashMap<>(); list.forEach(d -> map.put(d, map.containsKey(d) ? map.get(d)+1 : 1));
ctehm74n2#
另一种方法是使用不需要distinct的Collectors.counting。
Collectors.counting
Map<Double, Long> frequencies = list.stream() .collect(Collectors.groupingBy(Function.identity(), Collectors.counting()));
2条答案
按热度按时间sulc1iza1#
使用
Collections.frequency
创建一个所有非重复值的列表,并使用
Collections.frequency
方法计算每个值的出现次数。使用
Collectors.groupingBy
我认为它不如上面的例子好。
普通
for loop
简单的for循环相当短,可能不需要流和lambda
使用
forEach
使用forEach时甚至更短
ctehm74n2#
另一种方法是使用不需要distinct的
Collectors.counting
。