以regexp作为键的hashmap,groovy/java
我遇到了一个问题: 是否可以在hashmap中使用regexp作为键? 例如:以regexp作为键的hashmap,groovy/java,regex,groovy,hashmap,Regex,Groovy,Hashmap,我遇到了一个问题: 是否可以在hashmap中使用regexp作为键? 例如: def unitsMap=[ (~/(?i).*ABC.*nM.*/):'AAA', (~/(?i).*DEF.*nM.*/):'DDD' ] println unitsH3HashMap['ABC (122344345P)'] 当然,它返回空值 致以最诚挚的问候否,但您可以在交换机中使用它: def unitsMap(key) { switch(key) { case ~/
def unitsMap=[
(~/(?i).*ABC.*nM.*/):'AAA',
(~/(?i).*DEF.*nM.*/):'DDD'
]
println unitsH3HashMap['ABC (122344345P)']
当然,它返回空值
致以最诚挚的问候否,但您可以在交换机中使用它:
def unitsMap(key) {
switch(key) {
case ~/(?i).*ABC.*/: return 'AAA'
case ~/(?i).*DEF.*/: return 'DDD'
}
}
println unitsMap('ABC (122344345P)')
为了得到您想要的东西,您必须编写自己的Map实现,它使用模式匹配来执行getAt、putAt、contains等。然而,在我看来,在这种情况下查找的算法复杂性始终是O(n)。与HashMap(O(0))或TreeMap(O(logn))相比不是很好 @tim_yates的解决方案解决了问题的原始轮廓,但不允许您动态添加新的键(案例),就像您最初想要的代码一样。如果对“地图”的即时更改对您来说并不重要,那么您应该明确地使用他的解决方案(我现在将支持它+1)。如果没有,您可能能够修改他的代码,从映射中生成并调用一个脚本,该脚本将执行您想要的操作 此脚本:
// generate unitMapper
def generateUnitMapper(baseMap) {
def script = '''{ key ->
switch (key) {
'''
script += baseMap.collect { k, v ->
""" case ~/${k}/: return '${v}'
"""
}.join("")
script += ''' default: return null
}
}
'''
}
// notice this map is just using the regular expression STRINGS as keys,
// not the PATTERN objects from the original poster's code
def starterMap = [
/(?i).*ABC.*[\dA-Z]+.*/:'AAA',
/(?i).*DEF.*[\dA-Z]+.*/:'DDD'
]
def closureScript = generateUnitMapper(starterMap)
def unitsClosure = Eval.me(closureScript)
println closureScript
println unitsClosure('ABC (122344345P)')
println()
// regenerate map and closure and rerun
def changedMap = [ /ABC .*/:'000' ] + starterMap
closureScript = generateUnitMapper(changedMap)
unitsClosure = Eval.me(closureScript)
println closureScript
println unitsClosure('ABC (122344345P)')
产生以下输出:
{ key ->
switch (key) {
case ~/(?i).*ABC.*[\dA-Z]+.*/: return 'AAA'
case ~/(?i).*DEF.*[\dA-Z]+.*/: return 'DDD'
default: return null
}
}
AAA
{ key ->
switch (key) {
case ~/ABC .*/: return '000'
case ~/(?i).*ABC.*[\dA-Z]+.*/: return 'AAA'
case ~/(?i).*DEF.*[\dA-Z]+.*/: return 'DDD'
default: return null
}
}
000
非常感谢您的回复!