我有一个存储< city,state>的HashMap城市是关键和城市的对 国家是价值。现在城市名称可能是多个单词,比如“新德里”。现在有 许多句子可能包含也可能不包含城市名称。我想检查每一个。
一种方法是继续扫描HashMap并检查每个关键字是否存在于句子中。但是如果HashMap有数百万个条目,那将是一个 非常低效的方法。
所以我在寻找是否有任何有效的方法来做同样的事情。谢谢。
答案 0 :(得分:1)
1,将句子拆分为单词,并将城市名称拆分为单词,您可以通过哈希检查它们。
2,算法思路:
AC FSM,您只需一次即可将多个字符串与句子匹配。
后缀树,另一个算法。
我认为两者都相似。你可以选择一个。
答案 1 :(得分:0)
尝试
TreeMap<String, String> map = new TreeMap<>();
map.put("Delhi", "State");
map.put("New Delhi", "State");
map.put("New York", "State");
String[] a = map.keySet().toArray(new String[0]);
Set<String> found = new HashSet<>();
Scanner s = new Scanner("First is Delhi, next is New Delhi");
s.useDelimiter("[ .,\n\t\r]");
String prev = ""; // previous word
while (s.hasNext()) {
String n = s.next();
if (!prev.isEmpty()) {
n = prev + n;
}
int i = Arrays.binarySearch(a, n);
if (i >= 0) {
found.add(n);
prev = "";
} else {
i = -i - 1;
if (i < a.length && a[i].startsWith(n)) {
prev = n + " ";
} else {
prev = "";
}
}
}
System.out.println(found);
输出
[New Delhi, Delhi]
也许它有一些错误,但想法是使用排序的String数组(cities)和Arrays.binarySearch快速找到插入位置并检查元素(city)是否以当前单词开头。