2016-07-13 36 views
0

如何檢查列表是否包含子列表(子列表)或「根」中的鍵或值 並且可以獲取「路徑」?如何檢查列表是否包含Groovy中另一個列表中的值或鍵?

此的containsValue或containsKey方法似乎只在列表的根看

例僞:

//This is my list 
list = [languages:[_clazz:"basics.i18n.Language", messages:[_clazz:"basics.i18n.Message"]]] 

list.containsKey("languages") // return true 
list.containsValue("basics.i18n.Language") // return false where I want true 
list.containsKey("messages") // return false // return false where I want true 
list.containsValue("basics.i18n.Message") // return false where I want true 

回答

5

沒有什麼用Groovy爲了這個,我不覺得是,但你可以編寫自己的並將它們添加到Map(你有什麼是Map,不是List爲你命名的變量)

Map.metaClass.deepContainsKey = { value -> 
    delegate.containsKey(value) ?: 
    delegate.values().findAll { it instanceof Map }.findResult { it.deepContainsKey(value) } ?: 
    false 
} 

Map.metaClass.deepContainsValue = { value -> 
    delegate.containsValue(value) ?: 
    delegate.values().findAll { it instanceof Map }.findResult { it.deepContainsValue(value) } ?: 
    false 
} 

然後,給你的地圖:

def map = [languages:[_clazz:"basics.i18n.Language", messages:[_clazz:"basics.i18n.Message"]]] 

所有這些斷言傳:

assert map.deepContainsKey("messages") 
assert map.deepContainsValue("basics.i18n.Message") 
assert map.deepContainsValue("basics.i18n.Language") 

assert !map.deepContainsKey("missing") 
assert !map.deepContainsValue("novalue") 
+0

作品真的很好... :)謝謝! – Dasma

+0

一個簡單的事情,但我想你可以用'.any'替換'.findResult',因爲你並不需要返回值。如果你這樣做,你也可以從這些調用結束時消除'::false',因爲'.any'的返回值會產生相同的結果,而且工作量較少。 –

相關問題