嵌套流获取 - ConcurrentModificationException

问题描述 投票:0回答:0

所以我正在尝试解决面试问题,其中我给出了 6,4,7,9,3,12 的数组 并尝试返回加起来为 13 的三个值。问题是我只使用流来解决这个问题。没有基础。我尝试只用 .map 和 flatmap 来做,但由于我使用的是 void 方法,我最终不得不使用一个 foreach 循环。

这里是代码:

package com.example.demo_david;

import models.Wrapper;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;

import java.util.ArrayList;
import java.util.Collection;
import java.util.List;
import java.util.stream.Collectors;

@SpringBootApplication
public class DemoApplication {

    public static void main(String[] args) {
        SpringApplication.run(DemoApplication.class, args);

        Integer value = 13;
        List<Integer> fixMe = new ArrayList<>(List.of(6,4,7,9,3,12));
        System.out.println("answer: " + findTheOnesThatEqualTheResult(value, fixMe));
    }

    static List<Integer> findTheOnesThatEqualTheResult(int maxValue, List<Integer> list){
        Wrapper wrapper = new Wrapper();

        List<ArrayList<Integer>> collectedList = list.stream().map(fixMeCurrentNumber ->
                computeLogic(maxValue, wrapper, fixMeCurrentNumber)).collect(Collectors.toList());

        List<Integer> flattenedList = collectedList.stream()
                .flatMap(Collection::stream)
                .collect(Collectors.toList());

        return flattenedList;
    }

    private static ArrayList<Integer> computeLogic(int maxValue, Wrapper wrapper, Integer fixMeCurrentNumber) {

        if((wrapper.getSavedNumbers() == null && fixMeCurrentNumber <= maxValue) ||
                (wrapper.getSavedNumbers().size() == 0 && fixMeCurrentNumber <= maxValue )){
            ArrayList<Integer> fixMeList = new ArrayList<>();
            fixMeList.add(fixMeCurrentNumber);
            wrapper.setSavedNumbers(fixMeList);
            wrapper.setCurrentTotalOfList(fixMeCurrentNumber);
        }
        else {
            ArrayList<Integer> copyToBeItereatedOver = new ArrayList<>();
            copyToBeItereatedOver = wrapper.getSavedNumbers();
            copyToBeItereatedOver.stream().forEach(savedNumber -> {
                 validateSavedNumbers(maxValue, wrapper, fixMeCurrentNumber);
            });
        }
        return wrapper.getSavedNumbers();
    }

    private static void validateSavedNumbers(int maxValue, Wrapper wrapper,
                                             Integer fixMeCurrentNumber) {
        if(wrapper.getCurrentTotalOfList() < maxValue &&
                wrapper.getCurrentTotalOfList() + fixMeCurrentNumber <= maxValue) {
            ArrayList<Integer> savedNumbers = new ArrayList<>();
            savedNumbers = wrapper.getSavedNumbers();
            //tried passing a wrapper and still no luck.
            savedNumbers.add(fixMeCurrentNumber);
            //wrapper.setSavedNumbers(savedNumbers);
            //wrapper.setCurrentTotalOfList(wrapper.getCurrentTotalOfList() + fixMeCurrentNumber);
        }
    }
}




---------------

package models;

import lombok.Data;

import java.util.ArrayList;


@Data
public class Wrapper {
    ArrayList<Integer> savedNumbers;
    int currentTotalOfList;
}
---------------

问题是我在哪里保存了 saveNumbers.add(fixMeCurrentNumber); 然后它抛出 ConcurrentModificationException。

关于如何解决这个问题有什么建议吗?

为 wrapper.savedNumbers 传递嵌套对象包装器 - 没有用 我的下一个猜测是尝试一个迭代器——但我尽量不这样做,因为我想坚持使用流。

在我不做嵌套流的情况下,也许有更简单的方法吗? o.o

java foreach java-stream wrapper concurrentmodificationexception
© www.soinside.com 2019 - 2024. All rights reserved.