以regexp作为键的hashmap,groovy/java

以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 ~/

我遇到了一个问题:

是否可以在hashmap中使用regexp作为键? 例如:

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

非常感谢您的回复!