我有大量的键值参数映射到文件路径。大多数都有以下形式
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毫秒,我需要加快速度。
有没有办法可以进行常规查找以匹配通配符或其他一些可以组合所有映射的匹配技术?
答案 0 :(得分:4)
如果您使用TreeMap
而不是HashMap
,则可以执行前缀搜索以减少必须迭代的项目数。只需抓取*
或?
之前出现的字符,然后遍历以这些字符开头的所有键。当然,如果您的搜索字词以通配符开头,这将无效。
解决这个问题的另一个常见方法是使用字符ngrams
或一些基于特里结构的结构,但这要复杂得多。