java—有没有更好的方法终止iterator.foreachremaining

xytpbqjk  于 2021-06-30  发布在  Java
关注(0)|答案(3)|浏览(431)

我写了以下代码

List<Integer> ll = new ArrayList<>();
    numbers.forEach(n1 -> {
        numbers.iterator().forEachRemaining((Consumer<? super Integer>) n2 -> {
            numbers.iterator().forEachRemaining((Consumer<? super Integer>) n3 -> {
                if (n1 + n2 + n3 == 1234)
                    ll.addAll(Arrays.asList(n1,n2,n3));
                    throw new RuntimeException("elements found");
            });
        });
    });

我试着在一个数组中找到3个元素,它们的总和是1234。有没有更好的办法,终止最后一个先例?有没有更好的解决方案,使用streamapi,而不使用三个for循环(i,j,k)?
编辑:因为我得到了很多反馈,所以这段代码只是出于教育目的(更好地理解流和迭代器)。这不是解决问题的方法(在一个数组中找到三个构成1234之和的元素)。我假设foreachremaining将防止数组中元素的重复和-我错了,吸取了教训。

qmb5sa22

qmb5sa221#

你喜欢吗

List<Integer> doYourThingWith(List<Integer> numbers) {
    for (Integer n1 : numbers) {
        for (Integer n2 : numbers) {
            for (Integer n3 : numbers) {
                if (yourConditionIsTrue) return Arrays.asList(n1, n2, n3);
            }
        }
    }
    return null;
}

....
List<Integer> result=doYourThingWith(yourSetOfNumbers);
n3schb8v

n3schb8v2#

如果您必须使用流来解决它(我认为只有出于教育目的才合理),那么您必须流式处理索引,而不是元素。否则,重复的元素会泄漏为错误的结果,正如我在下面的注解中所示。

public static void main(String[] args) {
        List<Integer> numbers = new ArrayList<>();
        numbers.add(34);
        numbers.add(600);
        numbers.add(600);
        int[] result = IntStream.range(0, numbers.size()).boxed()
                .flatMap(first -> IntStream.range(0, numbers.size()).filter(second -> second != first).boxed()
                        .flatMap(second -> IntStream.range(0, numbers.size()).filter(third -> third != second && third != first).boxed()
                                .map(third -> new int[] {numbers.get(first), numbers.get(second), numbers.get(third)})
                                .filter(arr -> IntStream.of(arr).sum() == 1234)
                        )
                )
                .findFirst()
                .orElse(null);
        System.out.println(Arrays.toString(result));        
    }

建议您使用纯旧for循环的每个人(无论违反了什么规则)都是正确的。就用它吧。流是一个强大的概念,但用于不同类型的任务比你。

kt06eoxx

kt06eoxx3#

你可以这样做:

List<Integer> ll = numbers.stream()
    .flatMap(a -> numbers.stream()
        .flatMap(b -> numbers.stream()
            .filter(c -> a + b + c == 1234)
            .map(c -> Arrays.asList(a, b, c))
        )
    )
    .findFirst()
    .orElse(Collections.emptyList());

相关问题