2016-01-13 72 views
3
​def a = [[6, 4], [8, 6], [5, 3]] 

a.findAll { 
    it.findAll { 
     it != 4 && it != 6 
    } 
}​​ 

所以我寫了這個僞代碼,所以我不需要編寫我的複雜代碼。所以我想從數組中刪除所有的4,但如果我只寫it != 4 那麼它不會刪除它,如果我寫兩個數字,因爲我現在寫它!= 4 & & it!= 6然後它刪除它。我應該以不同方式使用它嗎?我想要這個陣列Groovy過濾器二維陣列

def a = [[6, 4], [8, 6], [5, 3]] 

例如,要刪除它的所有數字4。

回答

2

刪除4既然你需要修改你需要使用collect,而不是findAll集合:

def a = [ 
    [6, 4], 
    [8, 6], 
    [5, 3], 
    ] 

assert a.collect { l -> l.findAll { it != 4 } } == [[6], [8, 6], [5, 3]] 
+0

@Opal:你在我之前! :)你怎麼看待''collect''和''each''。他們在內部以不同的方式處理? –

+2

@GiuseppeRicupero在你的答案原始列表將被修改,'collect'返回新的。基本上就是這樣。 'each'是用於迭代,'collect'進行處理。 – Opal

4

4

使用in語法remove子表檢查子列表內。所以,你的代碼可以改寫爲:

def a = [[6,4],[8,6],[5,3]] 
assert [[8, 6], [5, 3]] == a.findAll { !(4 in it) } 

從各個子表

def a = [[6,4],[8,6],[5,3]] 
// Modify list in place, to return a new list use collect 
assert [[6], [8, 6], [5, 3]] == a.each{ it.removeAll { it == 4 } } 
+0

我想要的結果看起來像 [6],[8,6],[5,3] 所以它會刪除4.這是不可能的? – Argus