树结构算法

时间:2017-04-13 11:51:54

标签: java combinations permutation

我的程序有问题。例如,我有5个字段。这些字段的值为truefalse。可以删除False个字段 。所以我想找到这些领域的所有可能组合。

我的想法是:例如,我有一个包含这些字段的XML

  • Field1,true
  • Field2,true
  • Field3,false
  • Field4,false
  • Field5,false

结果应为:

{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”字段添加一次,并在列表中添加一次。 就像这里的图片一样。 tree

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()删除当前字段并使用控制台进行打印。

1 个答案:

答案 0 :(得分:0)

问题

存在多个问题:

  • 如果您当前的树节点有两个子节点,则必须下降到两个子节点,而不仅仅是左侧节点。
  • 最后,您返回了sammlung(engl。collection),但从未添加任何元素(至少在所提供的代码中没有)。
  • while循环与递归相结合似乎有些奇怪。但是,如果不查看iterateLeftiterateRight,我就不能说太多。

实施

实现该功能的快速方法如下。 为简单起见,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]