检查HashMap中的键是否存在于句子中

时间:2013-01-08 02:48:18

标签: java hashmap

我有一个存储< city,state>的HashMap城市是关键和城市的对 国家是价值。现在城市名称可能是多个单词,比如“新德里”。现在有 许多句子可能包含也可能不包含城市名称。我想检查每一个。

一种方法是继续扫描HashMap并检查每个关键字是否存在于句子中。但是如果HashMap有数百万个条目,那将是一个 非常低效的方法。

所以我在寻找是否有任何有效的方法来做同样的事情。谢谢。

2 个答案:

答案 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)是否以当前单词开头。