2012-08-14 23 views
9

Tôi có bản đồ sau:Trong Groovy, làm cách nào để thêm các giá trị cho một thuộc tính nhất định trong bản đồ?

def map = []; 
map.add([ item: "Shampoo", count: 5 ]) 
map.add([ item: "Soap", count: 3 ]) 

Tôi muốn để có được tổng của tất cả các count tài sản trong bản đồ. Trong C# sử dụng LINQ, nó sẽ giống như sau:

map.Sum(x => x.count) 

Làm cách nào để làm tương tự trong Groovy?

+2

Vui lòng kiểm tra mã của bạn - có vẻ như không đúng với tôi. Ví dụ. phương pháp "thêm" thường được sử dụng trong danh sách chứ không phải bản đồ. Dòng thứ ba bị thiếu "count:" key? – nickdos

+1

Mã này không hợp lệ. Kiểm tra nó trong bảng điều khiển groovy. –

+0

Rất tiếc, đây là những gì xảy ra khi bạn nhập câu hỏi khi bạn ra khỏi cửa :). –

Trả lời

18

Giả sử bạn có một danh sách như vậy:

List list = [ [item: "foo", count: 5], 
       [item: "bar", count: 3] ] 

Sau đó, có nhiều cách để làm việc đó. Các thể đọc được hầu hết có lẽ là

int a = list.count.sum() 

Hoặc bạn có thể sử dụng các hình thức Đóng tiền trên the whole list

int b = list.sum { it.count } 

Hoặc thậm chí bạn có thể sử dụng một tuyến đường phức tạp hơn như bơm

int c = list.count.inject { tot, ele -> tot + ele } // Groovy 2.0 
// c = list.count.inject(0) { tot, ele -> tot + ele } // Groovy < 2.0 

Tất cả những điều này đều cho kết quả tương tự.

assert (a == b) && (b == c) && (c == 8) 

Tôi sẽ sử dụng giá trị đầu tiên.

+0

Cảm ơn, điều đó dễ hơn tôi tưởng. –

0

Bạn muốn sử dụng toán tử collect. Tôi đã kiểm tra mã sau bằng groovysh:

list1 = [] 
total = 0 
list1[0] = [item: "foo", count: 5] 
list1[1] = [item: "bar", count: 3] 
list1.collect{ total += it.count } 
println "total = ${total}" 
+1

Tác phẩm này, nhưng không phải là Groovy ideomatic –

1

Trước hết, bạn đang nhầm lẫn cú pháp bản đồ và danh sách trong ví dụ của mình. Nhưng dù sao, Groovy đã tiêm phương thức .sum(closure) cho tất cả các bộ sưu tập.

Ví dụ:

[[a:1,b:2], [a:5,b:4]].sum { it.a } 
===> 6 
Các vấn đề liên quan