java - 使用一个流从列表中删除奇数,如果它们的总和是奇数,如果总和是偶数,则删除偶数
问题描述
我需要实现一个方法oddOrEven(List<Integer> integers)
:如果整数值的总和是奇数,则该方法应删除所有奇数元素,如果总和为偶数,则该方法应删除所有偶数。
任务是实现具有时间复杂度的方法O(N)
。我可以使用局部变量,但我应该只写一个流。
这是我有两个流的解决方案。
private static List<Integer> oddOrEven(List<Integer> integers) {
Integer sum = integers.stream().reduce(0, Integer::sum);
return integers.stream().filter((a) -> sum % 2 == 0 && a % 2 != 0 ||
sum % 2 != 0 && a % 2 == 0)
.collect(toList());
}
我还尝试在流中计算总和,但这不起作用,因为 sum.value 在List<Integer>
整数值的迭代过程中发生变化。
private static List<Integer> oddOrEven3(List<Integer> integers) {
class IntegerWrapper {
private int value = 0;
}
final IntegerWrapper sum = new IntegerWrapper();
return integers.stream()
.peek((a) -> sum.value += a)
.filter((a) -> {
return sum.value % 2 == 0 && a % 2 != 0 ||
sum.value % 2 != 0 && a % 2 == 0;
})
.collect(toList());
}
请帮我弄清楚如何只用一个流来解决任务?有没有办法将总和存储在迭代期间不变的流中?
解决方案
这是一个解决方案
private static List<Integer> oddOrEven(List<Integer> integers) {
final Map<Boolean, List<Integer>> oddsAndEvens = integers.stream()
.collect(Collectors.partitioningBy(i -> i % 2 == 0));
return oddsAndEvens.get(oddsAndEvens.get(false).size() % 2 != 0);
}
它通过将列表拆分为 2 个列表(奇数和偶数)来工作。然后它通过查看赔率列表的大小来选择要返回的列表。
推荐阅读
- flutter - list == [] 和 list.isEmpty Flutter 的区别
- php - 在结帐页面的产品标题下方显示单品价格 html
- google-bigquery - 如何根据bigquery中另一列中的重复值计算一列
- python - Python请求SSLError错误握手
- discord.js - 如何发送公会老板的名字?
- payara - Payara 不再支持 RMI。正确的?
- c++ - 如何使用 swig/cgo 调试“退出状态 3221225477”?
- angular - Spring boot websockets 通过 RxJs Angular Websockets 发送数据
- c - 如何创建单链表数组
- angular - 将 CUSTOM 数据:patentTempId,TempId 添加到 Angular Tree 节点材料