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);
}
我已经编写了以下方法来使用 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);
}