在Hashmap中搜索字符串数组的有效方法

时间:2019-04-25 17:42:50

标签: java arrays hashmap

我有以下带有字符串数组的哈希图:

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;    
}

这将有效地遍历整个哈希图值,直到找到匹配项为止。有更好的方法吗?

2 个答案:

答案 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()具有恒定的性能,因此该代码将仅根据分类器的数量进行迭代。