我有一个HashMap(String,Object)。关键是超过1个唯一ID的组合。我有一个输入,一个字符串,它是键的一部分(1个唯一ID)。我需要使用HashMap中的值来获取HashMap中的值,而不需要在HashMap中迭代数千个值。
我们可以使用HashMap.get()中的任何Regex语句来实现它吗?
我的密钥是xxx.yyy.zzz,其中xxx.zzz的组合在整个地图中是唯一的。我有xxx和zzz作为输入。此外,我为一个给定的zzz设置了yyy的可能值(5-6种可能性,也可能会增加)。
我现在有两种方法可以解决这个问题。
我更喜欢哪一个?
答案 0 :(得分:3)
从HashMap
检索值而不迭代条目/键(您不想要的)的唯一方法是搜索完整的密钥。
如果您需要通过部分密钥进行有效搜索,则应考虑使用其密钥为部分密钥的HashMap
。
答案 1 :(得分:3)
不,不能将部分键与HashMap
一起使用。
使用TreeMap
这可以通过所需密钥的部分前缀来实现,因为它允许您使用tailMap(String key)
返回将跟随特定密钥的地图的一部分(即您的密钥部分) )。您仍然需要处理条目以查看哪些条目与部分密钥匹配。
答案 2 :(得分:1)
如果您的密钥与xxx.yyy.zzz
类似,并且您希望使用xxx.*
类型访问权限,那么您可以考虑我的MapFilter类。
它允许您使用Map
并在某个键前缀上对其进行过滤。这将搜索特定的前缀并保留搜索结果以供日后使用。
答案 3 :(得分:0)
我们可以使用HashMap.get()中的任何Regex语句来实现它吗?
不,你不能。您需要传递确切的密钥才能获得相关的值。
或者,您应该迭代ober键并获取与之匹配的值。他们可以使用正则表达式来匹配键的输入字符串。
答案 4 :(得分:0)
您无法使用HashMap
执行此操作。但是,您可以使用TreeMap
,它将根据其自然顺序在内部存储密钥。您可以编写一个自定义搜索方法,该方法将使用正则表达式在集合中找到匹配键(如果存在)。如果写得正确,这将花费O(lgN)
时间,这比线性要好。问题减少为在String
s的有序列表中搜索String
。
正如@Thilo所指出的,这个解决方案假设您正在尝试匹配从开头开始而不是其他任何地方的密钥片段。
答案 5 :(得分:0)
HashMap适用于哈希算法,该算法维护密钥哈希码的哈希桶,并基于该哈希码哈希映射检索相应的值。对于您需要覆盖自定义对象的 equals()和 hashcode()方法。
所以
如果您尝试获取密钥的值,则会生成密钥的哈希码值,并根据该哈希码进行进一步的提取操作。
如果您不提供密钥的完全匹配,HashMap将如何找出具有错误哈希码的存储桶?