所以我正在尝试解决面试问题,其中我给出了 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