Java 8 - 生成列表的幂集

Java 8 - Generate power set of list

我已经编写了以下方法来使用 Java 8 映射函数

生成幂集
public static List<List<Integer>> powerSet(List<Integer> arr){
        List<List<Integer>> powerSet = new ArrayList<>();
        powerSet.add(new ArrayList<>());
        if(arr.size <= 0)
            return powerSet;
        for(Integer elem:arr) {
            powerSet.stream().map(p -> addSubset(powerSet, p, elem)).collect(Collectors.toList());
        }
        return powerSet;
    }

public static List<List<Integer>> addSubset(List<List<Integer>> powerSet, List<Integer> p, int elem){
    List<Integer> newSubset = p;
    newSubset.add(elem);
    powerSet.add(newSubset);
    return powerSet;
}

我总是遇到并发修改异常。如何修改此代码以生成列表的幂集?

您在遍历列表时正在修改它。这里有几个问题。

  • 不要使用流。它不合适或没有帮助。
  • 复制 powerSet 和每个周期添加的列表以避免 CME。
List<Integer> list = new ArrayList<>(List.of(20,30,40,50));
List<List<Integer>> ret = powerSet(list);
ret.forEach(System.out::println);

版画

[]
[20]
[30]
[20, 30]
[40]
[20, 40]
[30, 40]
[20, 30, 40]
[50]
[20, 50]
[30, 50]
[20, 30, 50]
[40, 50]
[20, 40, 50]
[30, 40, 50]
[20, 30, 40, 50]

修改后的方法。

    
public static List<List<Integer>> powerSet(List<Integer> arr) {
    List<List<Integer>> powerSet = new ArrayList<>();
    powerSet.add(new ArrayList<>());
    if (arr.size() <= 0)
        return powerSet;
    for (Integer elem:arr) {
        for (List<Integer> lst : powerSet) {      // <-- instead of streams.
            powerSet = new ArrayList<>(powerSet); // <-- new copy here
            addSubset(powerSet, lst, elem);
        }
    }
    return powerSet;
}
    
public static void addSubset(
        List<List<Integer>> powerSet, List<Integer> p, int elem) {
    p = new ArrayList<>(p); // <-- new copy here
    p.add(elem);
    powerSet.add(p);
}