2010-10-06 37 views

Trả lời

11

Hãy thử điều này:

def keys = [1, 2, 3] 
def values = ['a', 'b', 'c'] 
def pairs = [keys, values].transpose() 

def map = [:] 
pairs.each{ k, v -> map[k] = v } 
println map 

Hoặc:

def map = [:] 
pairs.each{ map << (it as MapEntry) } 
+1

Rất đẹp, có vẻ như 'transpose()' tương đương với 'zip()' của python. Bây giờ nếu chỉ có một Map constructor cho một danh sách các cặp. '[:]. putAll (pair.collect {new MapEntry (nó [0], nó [1])})' hoạt động như một lớp lót, nhưng là xấu hơn tôi muốn. – ataylor

+0

@ataylor Xem bài đăng cập nhật của tôi theo cách khác để sử dụng 'MapEntry' – NullUserException

+5

' [keys, values] .transpose(). Inject ([:]) {map, it -> map << (nó là MapEntry)} ' –

5

Không có bất cứ điều gì được xây dựng trực tiếp vào groovy, nhưng có một số cách để giải quyết nó một cách dễ dàng, đây là một:

def zip(keys, values) { 
    keys.inject([:]) { m, k -> m[k] = values[m.size()]; m } 
} 

def result = zip([1, 2, 3], ['a', 'b', 'c']) 
assert result == [1: 'a', 2: 'b', 3: 'c'] 
20

Ngoài ra còn có chức năng collectEntries trong Groovy 1.8 (hiện đang trong giai đoạn thử nghiệm)

def keys = [1, 2, 3] 
def values = ['a', 'b', 'c'] 
[keys,values].transpose().collectEntries { it } 
+0

Rất đẹp. Mong được thêm 1.8 giờ nữa. – ataylor

+5

Bạn thậm chí có thể bỏ phần đóng danh tính: '[khóa, giá trị] .transpose(). CollectEntries()' –

+0

@ Maxy-B vâng, kể từ 1.8.5 :-) –

Các vấn đề liên quan