【问题标题】:Search keys in Map地图中的搜索键
【发布时间】:2014-06-18 12:26:38
【问题描述】:

我使用 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(" ") 将查询拆分为单独的字符串,并递归限制匹配列表,但我不确定这是否是最佳的处理方式,以及是否可能尚未实现现有的“搜索引擎” 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;
}

【问题讨论】:

  • 这个解决方案似乎效率很低。您可以在使用地图的地方实现自定义数据结构?
  • 如果有 B C X A 键,对于 A C 搜索,它应该在你的结果中吗?
  • 肯特:是的,它也应该在结果中

标签: java search sortedmap


【解决方案1】:

您可以做的一件事是为映射“A B C D E”的键(“A”、“C”等)保留一个 Multimap,检索每个搜索词的所有映射并计算所有搜索的交集术语集。像这样:

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

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

【讨论】:

    【解决方案2】:

    这个方法应该为你工作:

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2015-02-18
      • 2018-08-23
      • 1970-01-01
      • 1970-01-01
      • 2016-10-26
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多