我有一组字符{'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);
}
}
答案 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)
}