您的位置:首页 > 其它

【Groovy】List对象的transpose和inject方法的使用

2011-11-29 12:53 483 查看
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()


inject()方法遍历集合,第一次将传递的值和集合项目传给闭包,将处理结果作为传递的值,和下一个集合项目传给闭包,依此类推

def list = [1,2,3]
result = list.inject(0){s,l -> s += l }
assert 6 == result


def list = ['like','groovy']
result = list.inject('I'){s,l -> "$s $l" }
assert "I like groovy" == result


两个方法结合使用举例,假设我们有两个List,分别是a和b,a和b的长度相同,现在我们想把a的每个元素作为key,b中对应的元素作为value,构造一个Map:

def a = [1, 2, 3]
def b = [4, 5, 6]
def m = [a, b].transpose().inject([:]) { s, l -> s + [(l[0]): l[1]] }
assert m == [1: 4, 2: 5, 3: 6]
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐