首页 > 解决方案 > 使用一个流从列表中删除奇数,如果它们的总和是奇数,如果总和是偶数,则删除偶数

问题描述

我需要实现一个方法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());
    }

请帮我弄清楚如何只用一个流来解决任务?有没有办法将总和存储在迭代期间不变的流中?

标签: javajava-stream

解决方案


这是一个解决方案

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 个列表(奇数和偶数)来工作。然后它通过查看赔率列表的大小来选择要返回的列表。


推荐阅读