5

次のようなマップがあるとします。

def myMap = [ b : [ c:"X" ] ]

そして文字列

def key = 'b.c'

キーを使用して値「X」を取得するためのオプションを確認したいと思います。

私はこれを自分で達成する 2 つの方法を考え出しましたが、これらの解決策にはあまり満足していません。

 1) Eval.me("theMap", myMap, "theMap.$key")
 2) mayMap."$key.split('\\.')[0]"."$key.split('\\.')[1]"

Groovyでこれを行うより良い方法はありますか?

4

2 に答える 2

16

便利な方法は、Map を実装するConfigObjectを使用することです。

def myMap = [b:[c:'X', d: 'Y'], a:[n:[m:[x:'Y']]]] as ConfigObject
def props = myMap.toProperties()

assert props['b.c'] == 'X'
assert props.'b.c' == 'X'
assert props.'a.n.m.x' == 'Y'

長所:

  • もう分割する必要はありません。
  • もう評価しません。
于 2013-07-03T01:10:47.983 に答える
3

私見はそれではなくConfigObject、それはトリックを行います、それはProperties(からConfigObject.toProperties())です。見て、試してみてください:

def props = new ConfigSlurper().parse("""
b {
 c = 'X'
 d = 'Y'
}
a {
 n {
   m {
     x:'Y'
   }
 }
}""")

assert props['b.c'] == 'X'
assert props.'b.c' == 'X'
assert props.'a.n.m.x' == 'Y'
'passed'

アサーションに失敗しました:

assert props['b.c'] == 'X'
       |    |       |
       |    [:]     false
       [b:[c:X, d:Y], a:[n:[m:[:]]], b.c:[:]]

    at ConsoleScript7.run(ConsoleScript7:14)

ConfigObjectそして、上記のような組み合わせキーでインデックスを作成できることを本当に望んでいます

于 2014-08-03T13:10:35.537 に答える