Groovy学习笔记——同时迭代多个List

假设我们有这样两个List:
def list1 = [1, 2, 3]
def list2 = [4, 5, 6]

我们需要检查是否第二个List的每个元素都比第一个List的对应元素大,最直接的想法是,迭代第一个List,然后通过下标访问第二个List:
def result = true
list1.eachWithIndex { n, i ->
if (n >= list2[i]) result = false
}
assert result

然而,这种方法不够直观,而且无法利用GDK本身提供的every方法。
实际上,我们可以利用[url=http://groovy.codehaus.org/groovy-jdk/java/util/Collection.html#transpose()]Collection.transpose()[/url]方法来实现:
assert [list1, list2].transpose().every { a, b ->
a < b
}

transpose()方法实际上就是数学中矩阵的转置,简单的来说就是行和列的交换:
assert [[1, 4], [2, 5], [3, 6]] == [list1, list2].transpose()

transpose()不止可以用于两个List,还能用于多个List。譬如,我们有第三个List:
def list3 = [7, 8, 9]

我们可以这样检查是否满足“list3 > list2 > list1”(每个对应的元素):
assert [list1, list2, list3].transpose().every { a, b, c ->
a < b && b < c
}
assert [[1, 4, 7], [2, 5, 8], [3, 6, 9]] == [list1, list2, list3].transpose()

有一点需要注意的是,如果List的长度不一,则取最短的长度:
def list4 = [1, 1, 1]
def list5 = [2, 2]
assert [[1, 2], [1, 2]] == [list4, list5].transpose()

以上代码在Groovy 1.5.7下测试通过。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值