2013-12-09 23 views
5

Tôi muốn cập nhật các giá trị trong bản đồ trong Groovy làm đầy các tiêu chí nhất định. Đây là mã của tôi:Cập nhật bản đồ bằng cách sử dụng findAll và mỗi bản đồ trong groovy

def m = [:] 
m['a'] = 1 
m['b'] = 2 
m['d'] = 3 
m.findAll { it.value > 1}.each { 
it.value = 4 
} 
println m 

Nhưng kết quả là sau đây:

[a:1, b:2, d:3] 

Có cách nào để làm điều đó bằng cả FindAll và mỗi? Hoặc tôi phải sử dụng

m.each {if (it.value>1) it.value=4} 

Trả lời

8

Nguyên nhân sâu xa là findAll trả về một mới Map dụ.

Vì vậy, bạn có thể thử:

newMap = m.findAll { it.value > 1}.each { 
    it.value = 4 
} 
println m  //No change 
println newMap //This is what you need! 

ra là

[a:1, b:2, d:3] 
[b:4, d:4] 
4

Trong mỗi trường hợp, giá trị bạn đang lặp lại với each là các mục nhập bản đồ với con trỏ tới khóa và giá trị. Khi bạn đặt it.value bạn không thay thế những gì có trong bản đồ. Bạn chỉ cập nhật con trỏ trong mục nhập bản đồ. Để thực sự thiết lập các giá trị, bạn sẽ cần phải làm như sau:

m.findAll { it.value > 1 }.each { m[it.key] = 4 } 
+0

Yep, đó là chính xác quá, tuy nhiên có lớn hơn phức tạp: O (n^2) – kazik1616

+0

Trên thực tế trong trường hợp này nó là chỉ O (2n). 'FindAll' sẽ có n bước và tồi tệ nhất,' each' sẽ thực hiện n bước. –

+0

Thay thế 'it.value' hoạt động. Tôi đăng câu trả lời của mình. –

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