java - Key-Value 参数与通配符匹配

标签 java data-structures hash wildcard

我有大量映射到文件路径的键值参数。大多数具有以下形式

filepath : /some/path
param_name_1 => 1234
param_name_2 => qwerty

但其他的可以包含通配符

filepath : /other/path
param_name_1 => 123*4
param_name_2 => ab?12

其中 ? 是匹配任意一个字符的通配符,* 是匹配 0+ 个字符的通配符。

我的用户可以提供他们自己的一组 KV 参数,我必须匹配这些参数并返回映射路径。

例子:用户提供

param_name_1 => 1234
param_name_2 => qwerty

Application returns /some/path

用户提供

param_name_1 => 123asdqweqweqdqweq1231asdcase4
param_name_2 => abW12

Application returns /other/path

对于所有不包含通配符的映射,我可以为我存储的映射和用户提供的映射计算 hashCode(),然后执行 HashMap 查找这是非常快的(3-4 个参数匹配,100000 个映射,在 0 毫秒内,毕竟它是一个哈希)。

虽然对于包含通配符的映射,我有点坚持通过包含通配符的所有映射的列表进行线性查找。大约有 2000-5000 个这样的映射,每次查找只需要不到 200 毫秒,我需要加快速度。

有没有一种方法可以进行常规查找以匹配通配符或可以组合所有映射的其他一些匹配技术?

最佳答案

如果您使用 TreeMap 而不是 HashMap,您可以进行前缀搜索以减少必须迭代的项目数。只需抓取出现在 *? 之前的字符,并遍历以这些字符开头的所有键。当然,如果您的搜索词以通配符开头,这将不起作用。

解决此问题的另一种常见方法是使用字符 ngrams 或一些基于 trie 的结构,但这要复杂得多。

关于java - Key-Value 参数与通配符匹配,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14363268/

相关文章:

java - 是否可以在一行代码中执行两个不同的 "+="和 "-="操作?

java.io.FileNotFoundException : in. txt,(系统找不到指定的文件)

java - float[]的ArrayList,无法检查ArrayList中是否包含float[]

c++ - 在没有小于谓词的情况下保持排序序列

java - 覆盖 hashCode() 时使用更大的素数作为乘数

c# - 是否可以在 C# 中处理单个位?尝试实现 SHA256 生成器

java - double 的最大整数值

c - 在 C 中,为什么尽管在代码中提到了链表节点内的 scanf 输入,但没有被获取?

java - LinkedBlockingQueue 与 ConcurrentLinkedQueue

algorithm - 需要一个低冲突哈希函数。输入都是相同 72 位的排列