2012-04-05 31 views
130

Tôi có một nhiệm vụ rất đơn giản mà tôi đang cố gắng làm trong Groovy nhưng dường như không thể làm cho nó hoạt động được. Tôi chỉ cố gắng lặp qua một đối tượng bản đồ trong groovy và in ra khóa và giá trị nhưng mã này không hoạt động.Lặp qua Bản đồ trong Groovy?

// A simple map 
def map = [ 
     iPhone : 'iWebOS', 
     Android: '2.3.3', 
     Nokia : 'Symbian', 
     Windows: 'WM8' 
] 

// Print the values 
for (s in map) { 
    println s + ": " + map[s] 
} 

tôi đang cố gắng để có được đầu ra trông như thế này:

iPhone: iWebOS 
Android: 2.3.3 
Nokia: Symbian 
Windows: WM8 

Ai đó có thể xin hãy giải thích về cách làm này ??

+0

Như bạn đã thấy trong các câu trả lời, vấn đề là iterating trên bản đồ cung cấp cho bạn một bộ sưu tập của "Entries", bạn đã được giả định nó sẽ cung cấp cho bạn các phím và bạn sẽ tra cứu các giá trị. Nếu bạn muốn thực hiện theo cách đó, hãy lặp lại trên map.keySet() và phần còn lại sẽ hoạt động như bạn mong đợi. –

+0

Nó sẽ hoạt động nếu bạn sử dụng 's.key' &' s.value' trong mã của bạn bên trong cho vòng lặp. – inblueswithu

Trả lời

249

Khá đơn giản với một kết thúc:

def map = [ 
      'iPhone':'iWebOS', 
      'Android':'2.3.3', 
      'Nokia':'Symbian', 
      'Windows':'WM8' 
      ] 

map.each{ k, v -> println "${k}:${v}" } 
+1

Ngoài sự tò mò, tài liệu này được viết trong tài liệu ngôn ngữ Groovy ở đâu (** Tôi không nghĩ là! **)? Tôi đoán tôi đang tự hỏi, từ góc nhìn của một người mới của Groovy, * Làm sao bạn biết được điều này? * – smeeb

+5

@smeeb: mọi thứ đều được ghi lại đầy đủ, hãy xem tại đây: http://www.groovy-lang.org/groovy- dev-kit.html # _iterating_on_maps – Jack

13

Khi sử dụng vòng lặp for, giá trị của s là một yếu tố Map.Entry, có nghĩa là bạn có thể nhận chìa khóa từ s.key và giá trị từ s .Value

+0

Cảm ơn bạn đã giải thích * tại sao * mã OP không hoạt động – dj18

74

Hoặc bạn có thể sử dụng một vòng lặp for như trong Groovy Docs:

def map = ['a':1, 'b':2, 'c':3] 
for (e in map) { 
    print "key = ${e.key}, value = ${e.value}" 
} 

/* 
Result: 
key = a, value = 1 
key = b, value = 2 
key = c, value = 3 
*/ 

một lợi ích của việc sử dụng một vòng lặp for trái ngược với một đóng cửa each là gỡ lỗi dễ dàng hơn, vì bạn không thể nhấn một điểm ngắt bên trong một đóng cửa each (khi sử dụng Netbeans).

+0

Tôi sử dụng GGTS 3.2 và thường xuyên thiết lập các điểm ngắt trong các bao đóng (bao gồm cả "đóng cửa"). Vấn đề là sử dụng F6 để bước qua một đóng cửa, vì nó sẽ đi qua toàn bộ điều. Về mặt kỹ thuật, bạn có thể nhấn F5 một loạt các lần và cuối cùng kết thúc ở đó, nhưng một điểm break là nhanh hơn. – Philip

+0

Đã cập nhật câu trả lời. Tôi đang sử dụng Netbeans và gỡ lỗi Groovy/Grails của nó là sub-par. – ubiquibacon

+1

Ngoài ra, bạn có thể thoát ra khỏi vòng lặp for và không nằm trong '.each'. –

10

Một tùy chọn khác:

def map = ['a':1, 'b':2, 'c':3] 
map.each{ 
    println it.key +" "+ it.value 
} 
Các vấn đề liên quan