在地图中搜索关键字

时间:2014-06-18 12:26:39

标签: java search sortedmap

我使用SortedMap来保存String键和ArrayList之间的映射值。键是由几个单词组成的简单字符串。我想获得与查询关键匹配的所有条目。

所以,如果我有以下映射:

"A B C D E" => ArrayList("hello","hi","howdy")
"A C B"  => ArrayList("hehe","haha","hihi") 
"C B E" => ArrayList("non", "sense")

并且我查询“A C”我返回对应于“A B C D E”和“A C B”的两个条目,具有相应的相似系数(0.4和0.66)。

我的想法是使用.keySet()遍历所有键。然后我将查询拆分为带有query.split(“”)的单独Strigns,并递归地限制匹配列表,但我不确定这是否是执行操作的最佳方式,以及是否可能已经存在“搜索引擎” Java的。

我的划痕:

public HashMap<String,Double> searchTags(String query) {

    HashMap<String,Double> hash = new HashMap<String,Double>();

    double similarity = 0;

    //split tags
    String[] tags = query.split(" ");

    for (String key : this.tagsToUtterance.keySet()) {
        for (String tag : tags) {
            if (key.contains(tag)) {
                System.out.println("ok");
                hash.put(key,similarity);
                similarity =+1 ;
            }
        }
        similarity = similarity/key.split(" ").length;
    }

    return hash;
}

2 个答案:

答案 0 :(得分:0)

你可以做的一件事就是为你的键(&#34; A&#34;,&#34; C&#34;等......)保留一张Multimap到映射&#34; ABCD E&#34 ;,为每个搜索词检索所有映射并计算所有搜索词集的交集。像这样:

Set<SearchMap> getMappings(List<String> searchTerms) {
    Set<SearchMap> result = this.getSearchMapForTerm(searchTerms.get(0));

    for(int i=1;i< searchTerms.size(); i++) {
        Sets.intersection(result, this.getSearchMapForTerm(searchTerms.get(i)));
    }
    return result;
}

查看guava集合API:http://code.google.com/p/guava-libraries/wiki/GuavaExplained

这只是一个快速而肮脏的解决方案。 (添加边界检查等...)

答案 1 :(得分:0)

此方法应该为您完成工作:

private Map<Double, Entry<String, ArrayList<String>>> queryMethod(
            Map<String, ArrayList<String>> map, String queryString) {
        Map<Double, Entry<String, ArrayList<String>>> result = new HashMap<Double, Entry<String, ArrayList<String>>>();
        queryString = queryString.replaceAll(" ", "");

        for (Entry<String, ArrayList<String>> entry : map.entrySet()) {
            String key = entry.getKey().replaceAll(" ", "");
            boolean contained = true;

            for (char c : queryString.toCharArray()) {
                if (key.indexOf(c) < 0) {
                    contained = false;
                    break;
                }
            }

            if (contained) {
                double percent = (double) queryString.length()
                        / (double) key.length();
                result.put(new Double(percent), entry);
            }
        }

        return result;
    }

使用您的SortedMap使用String-ArrayList对和您愿意搜索的字符串调用该方法,它将返回一个Map,其中包含原始Map中的百分比+相应的条目。