创建字符映射到真值的所有组合

时间:2015-08-07 20:58:24

标签: java

我有一组字符{'p', 'q', 'r', ...},我想在从字符到布尔值的映射的所有排列中调用run()(不重要的是)。例如,如果我的字符集是{'p','q','r'}并且我天真地手动完成了每个排列,它将如下所示:

private static void runMaps(){
    HashMap<Character,Boolean> m = new HashMap<>();
    m.put('p', true);
    m.put('q', true);
    m.put('r', true);
    run(m);

    m = new HashMap<>();
    m.put('p', true);
    m.put('q', true);
    m.put('r', false);
    run(m);

    // ...
    // 8 permutations
}

这让我烦恼,因为我知道我可以(并且应该可以)在这里使用递归,但我正在努力。

修改:过了一会儿,我设法让它运转起来。下面的代码中添加了一些内容,但是显示了一般的想法。

private static boolean runMaps(SyntaxTree formula, ArrayList<String> chars, HashMap<String, Boolean> map, int index) {

if (index == chars.size()) {
    return checkFormula(formula, map).getData().equals("true");
} else {
    HashMap<String, Boolean> newMap1 = (HashMap<String, Boolean>) map.clone();
    newMap1.put(chars.get(index), true);
    HashMap<String, Boolean> newMap2 = (HashMap<String, Boolean>) map.clone();
    newMap2.put(chars.get(index), false);
    return runMaps(formula, chars, newMap1, index + 1) && runMaps(formula, chars, newMap2, index + 1);
}

}

1 个答案:

答案 0 :(得分:0)

基本概念是按照某种顺序浏览地图,然后将其分开,一次更改一个字符。

伪代码中的类似内容:

    Character[] keys = map.getKeys() // or something similar sounding
    int length = keys.length
    int position = 0

    function(keys, position, length, map) {
            if position >= length
                    return
            map.put(keys[position], false) // run all permutations with 0 in front
            function(keys, position+1, length, map)
            run(map)

            map.put(keys[position], right) // run all permutations with 1 in front
            function(keys, position+1, length, map)
            run(map)
    }