1. 程式人生 > >Groovy學習筆記——同時迭代多個List

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下測試通過。