Vòng qua Bản đồ trong Groovy?


175

Tôi có một nhiệm vụ rất đơn giản mà tôi đang cố gắng thực hiện 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.

// 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ể vui lòng giải thích làm thế nào để làm điều này ??


Như bạn đã thấy trong các câu trả lời, vấn đề là việc lặp lại trên bản đồ cung cấp cho bạn một bộ sưu tập "Mục nhập", bạn đã cho rằng nó sẽ cung cấp cho bạn các khóa và bạn sẽ tìm kiếm các giá trị. Nếu bạn muốn làm 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.
Bill K

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

Câu trả lời:


328

Khá đơn giản với việc đóng cửa:

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

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

2
Vì tò mò, tài liệu này được ghi lại ở đâu trong các tài liệu ngôn ngữ Groovy ( tôi không nghĩ là vậy! )? Tôi đoán tôi đang tự hỏi, từ quan điểm của người mới Groovy, Làm thế nào bạn biết điều này?
smeeb

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

101

Ngoài ra, bạn có thể sử dụng một forvòng lặp như được hiển thị 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 forvòng lặp thay vì eachđóng cửa là gỡ lỗi dễ dàng hơn, vì bạn không thể đạt điểm dừng trong một lần eachđóng (khi sử dụng Netbeans).


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

Cập nhật câu trả lời. Tôi đang sử dụng Netbeans và việc gỡ lỗi Groovy / Grails của nó là tương đương.
ubiquibacon

4
Thêm vào đó bạn có thể thoát ra một vòng lặp for và không trong .each.
Alexander Suraphel 17/2/2015

1
@AlexanderSuraphel bạn đúng rằng bạn không thể sử dụng breakđể thoát each, nhưng bạn có thể sử dụngreturn
ubiquibacon 21/07/2015

7
@ubiquibacon không bạn không thể. returntương tự như continuekhông break.
Alexander Suraphel 21/07/2015

20

Khi sử dụng vòng lặp for, giá trị của s là một phần tử Map.Entry, nghĩa là bạn có thể lấy khóa từ s.key và giá trị từ s.value


5
Cảm ơn vì đã giải thích lý do tại sao mã của OP không hoạt động
dj18

15

Một lựa chọn khác:

def map = ['a':1, 'b':2, 'c':3]
map.each{
  println it.key +" "+ it.value
}
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.