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

来源:互联网 发布:免费手机短信群发软件 编辑:程序博客网 时间:2024/06/05 08:41
转自:http://johnnyjian.iteye.com/blog/271554
假设我们有这样两个List: 
Java代码  收藏代码
  1. def list1 = [123]  
  2. def list2 = [456]  

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

然而,这种方法不够直观,而且无法利用GDK本身提供的every方法。 
实际上,我们可以利用Collection.transpose()方法来实现: 
Java代码  收藏代码
  1. assert [list1, list2].transpose().every { a, b ->  
  2.     a < b  
  3. }  

transpose()方法实际上就是数学中矩阵的转置,简单的来说就是行和列的交换: 
Java代码  收藏代码
  1. assert [[14], [25], [36]] == [list1, list2].transpose()  

transpose()不止可以用于两个List,还能用于多个List。譬如,我们有第三个List: 
Java代码  收藏代码
  1. def list3 = [789]  

我们可以这样检查是否满足“list3 > list2 > list1”(每个对应的元素): 
Java代码  收藏代码
  1. assert [list1, list2, list3].transpose().every { a, b, c ->  
  2.     a < b && b < c  
  3. }  
  4. assert [[147], [258], [369]] == [list1, list2, list3].transpose()  

有一点需要注意的是,如果List的长度不一,则取最短的长度: 
Java代码  收藏代码
  1. def list4 = [111]  
  2. def list5 = [22]  
  3. assert [[12], [12]] == [list4, list5].transpose()  

以上代码在Groovy 1.5.7下测试通过。