2016-01-13 80 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