【问题标题】:How can I efficiently get all Strings from a HashMap that match a regex/prefix [Java]如何有效地从 HashMap 中获取与正则表达式/前缀匹配的所有字符串 [Java]
【发布时间】:2020-04-13 19:37:19
【问题描述】:

我有一个 HashMap,其中读取了一堆字符串数据,我希望人们能够通过输入搜索字符串来搜索字符串,并且 HashMap 应该给出与该搜索字符串匹配的所有数据。

例如:


搜索字符串:做

结果:

渡渡鸟

多力多滋


有什么方法可以在保持良好的时间复杂度的同时实现这一目标?

【问题讨论】:

  • 能否添加 HashMap 示例?
  • 我要做的第一件事就是切换到 TreeMap。
  • @Pitto 你是什么意思?
  • @DavidConrad 虽然时间复杂度不是很好
  • @EltoCode 这是一个 NavigableMap,所以你可以从 Do 开始到第一个,然后到下一个,直到你完成所有的 Do,然后停止,但是使用 HashMap 你必须遍历地图中的每个条目,因此这个用例的时间复杂度要好得多。

标签: java search hashmap


【解决方案1】:

TreeMap 是一个 NavigableMap,它是一个 SortedMap,它允许您找到第一个键小于或等于给定值的条目、给定值之后具有键的下一个条目,甚至是所有的子图起始值和结束值之间的条目。

如果您要查找以“Do”开头的所有条目,则不属于该集合的第一个条目将以“Dp”或稍后的值结尾。一般来说,第一个不匹配的前缀总是可以通过递增您正在搜索的前缀的最后一个字符来找到。以下是如何使用它来解决您的问题:

public void search(NavigableMap<String, String> navmap, String searchTerm) {
    String stopTerm = incrementLastChar(searchTerm);
    System.out.format("Searching range [%s, %s)%n", searchTerm, stopTerm);
    SortedMap<String, String> range = navmap.subMap(searchTerm, stopTerm);
    for (Map.Entry<String, String> entry : range.entrySet()) {
        System.out.println(entry.getKey());
    }
}

public String incrementLastChar(String term) {
    char[] chars = term.toCharArray();
    chars[chars.length - 1] += 1;
    return new String(chars);
}

将要搜索的数据放入 TreeMap 中。我不知道你的值是什么,所以我只是把它做成了一个从字符串到字符串的 TreeMap。将其作为 NavigableMap 连同您要搜索的前缀一起传入。我创建了一个辅助方法来创建停止项。即不在您要搜索的范围内的最低前缀。 search 方法打印出它正在搜索的范围,以及找到的所有项目的键。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-08-15
    • 2012-07-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多