我使用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;
}
答案 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中的百分比+相应的条目。