我有以下带有字符串数组的哈希图:
public static HashMap<String, String[]> map = new HashMap<String, String[]>();
map.put("calculus",new String[] {"math","logic"});
map.put("chemisty",new String[] {"ions","electrons"});
map.put("biology",new String[] {"life","bacteria"});
我有一个要在Hashmap的String数组中搜索的字符串。我的代码是:
public String findFn(String myString) {
for (Map.Entry<String, String[]> entry : map.entrySet()) {
String key = entry.getKey();
for(String s : entry.getValue()) {
if(s.contains(myString)) {
return key;
}
}
}
return null;
}
这将有效地遍历整个哈希图值,直到找到匹配项为止。有更好的方法吗?
答案 0 :(得分:3)
使用当前的数据结构,这是您可以做的最好的事情。如果需要经常执行此操作,则应使用反向关系构建另一个Hashmap,其中“主题”为键,而“课程”为值。
答案 1 :(得分:0)
如果HashMap
中的条目数较少,而值中的项目数较多,那么我将对您的代码进行一些修改,即用HashSets替换数组:
public static HashMap<String, Set<String>> map = new HashMap<>();
map.put("calculus", new HashSet());
map.get("calculus").add("math");
...
public String findFn(String myString) {
for (Map.Entry<String, Set<String>> entry : map.entrySet()) {
for(String s : entry.getValue()) {
if(s.contains(myString)) {
return entry.getKey();
}
}
}
return null;
}
HashSet.contains()
具有恒定的性能,因此该代码将仅根据分类器的数量进行迭代。