Groovy :: Карта найти рекурсивный - PullRequest
4 голосов
/ 31 мая 2011

Редактировать См. Ниже решение @ tim для «правильного» Groovy-esque подхода к рекурсии карты.Поскольку Map findRecursive еще не существует в Groovy, если вам нужна эта функциональность в различных частях вашего приложения, просто добавьте ее в метакласс Map:

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')

Original как findResult {it.key == 'foo'} будет проходить через элементы карты за пределами глубины 1-го, но, похоже, это не так.

Прокрутил мой собственный рекурсивный искатель карт, но мне интересно, есть лилучший способ сделать это.Может быть, мне не хватает встроенной функции или хотя бы 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 Ответ

10 голосов
/ 31 мая 2011

С Groovy 1.8 (для метода findResult требуется) вы можете сделать что-то вроде этого:

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 по умолчанию ...

...