繁体   English   中英

如何有效地从 HashMap 中获取与正则表达式/前缀匹配的所有字符串 [Java]

[英]How can I efficiently get all Strings from a HashMap that match a regex/prefix [Java]

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

例如:


搜索字符串:做

结果:

渡渡鸟

多力多滋


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

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 方法打印出它正在搜索的范围,以及找到的所有项目的键。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM