我的程序有问题。例如,我有5个字段。这些字段的值为true
或false
。可以删除False
个字段 。所以我想找到这些领域的所有可能组合。
我的想法是:例如,我有一个包含这些字段的XML
结果应为:
{Field1, Field2, Field3, Field4, Field5}
{Field1, Field2, , Field4, Field5}
{Field1, Field2, , , Field5}
{Field1, Field2, , , }
{Field1, Field2, Field3, , Field5}
{Field1, Field2, Field3, , }
{Field1, Field2, Field3, Field4, }
{Field1, Field2, , Field4, }
8个组合。
我的想法是,它可以通过树形结构解决。我将检查当前字段是“true”还是“false”。如果“是”,那么我将向前移动一个字段。如果该字段为“false”,我将复制XML并使用当前“false”字段添加一次,并在列表中添加一次。 就像这里的图片一样。
public List<List<Fieldmatrix>> permut(List<Fieldmatrix> matrix, int j) {
while (felderLaenge != j) {
if (!matrix.get(j).isTrue()) {
tmpL = iterateLeft(matrix, j);
tmpR = iterateRight(matrix, j);
} else {
tmpL = iterateRight(matrix, j);
}
j++;
return permut(tmpL, j);
}
return sammlung;
}
iterateLeft
表示删除,iterateRight
表示不删除。
我无法实现复制功能。所以我只有4 Xmls的结果:
{1,2,3,4,5}, {1,2,4,5}, {1,2,3,5}, {1,2,3,4}
有人可以帮助我吗?
首先,我感谢您的第一次支持。
Fieldmatrix-Class看起来像:
public class Fieldmatrix {
private String feld;
private boolean pflicht;
public Fieldmatrix(String feld, boolean pflicht){
this.feld = feld;
this.pflicht = pflicht;
}
public String getFeld() {
return feld;
}
public void setFeld(String feld) {
this.feld = feld;
}
public boolean isPflicht() {
return pflicht;
}
public void setPflicht(boolean pflicht) {
this.pflicht = pflicht;
}
}
如何更改此部分“prefixWithField.add(?)” 你使用String处理它,这是有效的,因为List也是String的类型。 但是我和List一起工作
iterateRight()仅使用控制台进行打印。 ieterateLeft()删除当前字段并使用控制台进行打印。
答案 0 :(得分:0)
存在多个问题:
sammlung
(engl。collection
),但从未添加任何元素(至少在所提供的代码中没有)。while
循环与递归相结合似乎有些奇怪。但是,如果不查看iterateLeft
和iterateRight
,我就不能说太多。实现该功能的快速方法如下。
为简单起见,Fieldmatrix
类已被String
替换。
public static List<List<String>> combine(List<String> fields) {
return combine(fields, 0, new ArrayList<>());
}
public static List<List<String>> combine(List<String> fields,
int start, List<String> prefix) {
List<List<String>> combinations = new ArrayList<>();
if (start >= fields.size()) {
combinations.add(prefix);
return combinations;
}
String field = fields.get(start);
if (field.contains("false")) {
combinations.addAll(combine(fields, start + 1, prefix));
}
List<String> prefixWithField = new ArrayList<>(prefix);
prefixWithField.add(field);
combinations.addAll(combine(fields, start + 1, prefixWithField));
return combinations;
}
此实施效率不高。很多中间结果被反复复制。
List<String> fields = new ArrayList<>();
fields.add("1:true");
fields.add("2:true");
fields.add("3:false");
fields.add("4:false");
fields.add("5:false");
combine(fields).forEach(c -> System.out.println(c));
打印
[1:true, 2:true] [1:true, 2:true, 5:false] [1:true, 2:true, 4:false] [1:true, 2:true, 4:false, 5:false] [1:true, 2:true, 3:false] [1:true, 2:true, 3:false, 5:false] [1:true, 2:true, 3:false, 4:false] [1:true, 2:true, 3:false, 4:false, 5:false]