我正在尝试删除java 8中的重复数字,包括引用数量。例如,我有一个数组,其值如(2,3,2,5)
应删除所有数字2,并且数字应保留为3和5。 所以预期的总和是8.但是在我的下面的代码中,它仍然得到2.它确实删除了重复的数字,但仍然保留了数字参考。
这是我的代码。
List<Integer> clearedNumbers = numbers.stream().distinct().collect(Collectors.toList());
int sum = clearedNumbers.stream().mapToInt(Integer::intValue).sum();
我得到的总和是10而不是8。
答案 0 :(得分:5)
我会收集每个号码的数量,并且只计算单打:
System.out.println(
Stream.of(2,3,2,5)
.collect(Collectors.groupingBy(Function.identity(), Collectors.counting()))
.entrySet()
.stream()
.filter(e -> e.getValue() == 1)
.mapToInt(Map.Entry::getKey)
.sum());
输出8
答案 1 :(得分:1)
你可以做得更聪明一点......(每当你通过zero
获得重复到combiner
的重复地图时):
int result = Stream.of(2, 3, 2, 5)
.collect(Collectors.collectingAndThen(
Collectors.toMap(
Function.identity(),
Function.identity(),
(x, y) -> 0),
map -> map.values().stream().mapToInt(Integer::intValue).sum()))
答案 2 :(得分:0)
您获得的总和是正确的,因为它删除了重复项并执行了总和操作,您想要的是删除所有频率多于一的数字并执行求和操作。试试这个。
List<Integer> numbers = new ArrayList<>();
numbers.add(2);
numbers.add(3);
numbers.add(2);
numbers.add(5);
List<Integer> clearedNumbers = numbers.stream().filter(num -> {
return Collections.frequency(numbers, num) == 1;
}).collect(Collectors.toList());
int sum = clearedNumbers.stream().mapToInt(Integer::intValue).sum();
System.out.println(sum);
答案 3 :(得分:0)
为什么不应用简单方法创建另一个没有当前元素的数组列表并进行比较。如果compare返回false,则添加它们。请看下面的代码片段:
public static void main(String[] args) {
List<Integer> a = new ArrayList<Integer>();
List<Integer> b = new ArrayList<Integer>();
a.add(2);
a.add(2);
a.add(3);
a.add(5);
int sum = 0;
for(int i=0; i < a.size(); i++) {
b.clear();
for(int j = 0; j < a.size(); j++) {
if(j != i)
b.add(a.get(j));
}
if(! b.contains(a.get(i)))
sum = sum + a.get(i);
}
System.out.println(sum);
}
它可以提供所需的结果。
答案 4 :(得分:0)
使用Collections.Frequency API,
System.out.println(numbers.stream()
.filter(i -> Collections.frequency(numbers, i)==1)
.mapToInt(Integer::intValue)
.sum());