Groovy :: Map Find Recursive

时间:2011-05-31 09:46:22

标签: recursion groovy map find

修改 请参阅下面的@ tim's解决方案,了解用于映射递归的“正确”Groovy-esque方法。由于Groovy中尚不存在Map findRecursive,如果您发现自己需要在应用的各个部分使用此功能,只需将其添加到Map metaClass:

Map.metaClass.findRecursive = {String key->
    if(delegate.containsKey(key)) return delegate."$key"
    else
        for(m in delegate) {
            if(m.value in Map) return m.value.findRecursive(key)
        }
}
// then anywhere in your app
someMap.findRecursive('foo')

原始 希望像findResult {it.key =='foo'}这样的东西可以通过超出1-d深度的地图元素进行递归,但似乎并非如此。

滚动我自己的递归地图查找器,但我想知道是否有更好的方法来执行此操作。也许有一个我缺少的内置函数,或者甚至是Groovier(简洁)的方式来实现以下功能:

Map map = [school:[id:'schoolID', table:'_school',
    children:[team:[id:'teamID',table:'_team',
        children:[player:[id:'playerID',table:'_roster']]
    ]]
]]

class Foo {
    static finder = {Map map, String key->
        if(map.containsKey(key)) return map[key]
        else
            for(m in map) {
                if(m.value in Map) return this.finder(m.value,key)
            }
    }
}
println Foo.finder(map,'team') 

1 个答案:

答案 0 :(得分:10)

使用Groovy 1.8(findResult方法的reqd),你可以这样做:

class DeepFinder {
  static Object findDeep( Map map, Object key ) {
    map.get( key ) ?: map.findResult { k, v -> if( v in Map ) v.findDeep( key ) }
  }
}

use( DeepFinder ) {
  println map.findDeep( 'team' )
}

我知道没有递归的默认Groovy方法......