【发布时间】:2013-11-29 00:49:06
【问题描述】:
如果hashmap 的值是Boolean,那么值得使用Hashset 吗?我的问题会令人困惑,但要提出正确的话也不容易。下面的代码解释了我的问题。该代码解决了以下问题Given some cubes, can cubes be arranged such that an input word can be formed from top view of cubes? 例如:假设一个假想的立方体只有三个表面,其中cube1: {a, b, c} 和cube2 {m, n, o},则可以形成单词an,但不能形成单词ap。对于这个问题,我有两种方法,使用HashMap<String, boolean> 或使用Hashset。 Hashmap 的优点是它不会引起大量的重新散列。 hashset 的优点是代码看起来(至少对我来说)更小更干净。在这种情况下,正确的解决方案/行业范围内遵循的做法是什么?
选项 1:char[][] m 是立方体的集合,其中行是立方体,列是表面
public static boolean checkWord(char[][] m, String word) {
final Map<Character, Boolean> charAvailable = new HashMap<Character, Boolean>();
char[] chWords = word.toCharArray();
for (char ch : chWords) {
charAvailable.put(ch, true);
}
return findWordExists(m, charAvailable, 0);
}
private static boolean findWordExists (char[][] m, Map<Character, Boolean> charAvailable, int cubeNumber) {
if (cubeNumber == m.length) {
Collection<Boolean> booleanValues = charAvailable.values();
for (boolean available : booleanValues) {
if (available) return false;
}
return true;
}
for (int i = 0; i < m[cubeNumber].length; i++) {
if (charAvailable.get(m[cubeNumber][i]) == Boolean.TRUE) {
charAvailable.put(m[cubeNumber][i], false);
if (findWordExists(m, charAvailable, cubeNumber + 1)) {
return true;
}
charAvailable.put(m[cubeNumber][i], true);
}
}
return false;
}
选项 2:char[][] m 是立方体的集合,其中行是立方体,列是表面
public static boolean checkWord(char[][] m, String word) {
final Set<Character> charAvailable = new HashSet<Character>();
char[] chWords = word.toCharArray();
for (char ch : chWords) {
System.out.println(" adding: " + ch);
charAvailable.add(ch);
}
return findWordExists(m, charAvailable, 0);
}
private static boolean findWordExists (char[][] m, Set<Character> charAvailable, int cubeNumber) {
if (cubeNumber == m.length) {
return charAvailable.isEmpty();
}
for (int i = 0; i < m[cubeNumber].length; i++) {
if (charAvailable.contains(m[cubeNumber][i])) {
charAvailable.remove(m[cubeNumber][i]);
if (findWordExists(m, charAvailable, cubeNumber + 1)) {
return true;
}
charAvailable.add(m[cubeNumber][i]);
}
}
return false;
}
【问题讨论】: