Prototype (framework JavaScript) có method zip()
thực hiện chính xác những gì bạn cần. Điều đó không giúp bạn mặc dù, tôi biết. Hài hước, tôi đã mong đợi Groovy sẽ có một cái gì đó tương tự, nhưng tôi không thể tìm thấy bất cứ điều gì trong lớp Collection
hoặc List
.
Dù sao, đây là một thực hiện không-quá-xinh đẹp của zip()
:
List.metaClass.zip = { List other, Closure cl ->
List result = [];
Iterator left = delegate.iterator();
Iterator right = other.iterator();
while(left.hasNext()&& right.hasNext()){
result.add(
cl.call(left.next(), right.next())
);
}
result;
}
Và ở đây nó là trong hành động:
def list1 = [1, 1, 1]
def list2 = [1, 1, 1]
print (list1.zip(list2) {it1, it2 -> it1 + it2})
Output:
[2, 2, 2]
Tất nhiên bạn cũng có thể làm điều đó theo một cách ít chung nếu bạn muốn giải quyết chính xác vấn đề của bạn (và không thực hiện một zip/chức năng bản đồ generic):
List.metaClass.addValues = { List other ->
List result = [];
Iterator left = delegate.iterator();
Iterator right = other.iterator();
while(left.hasNext()&& right.hasNext()){
result.add(
left.next() + right.next()
);
}
result;
}
def list1 = [1, 1, 1]
def list2 = [1, 1, 1]
print (list1.addValues(list2))
// Output again: [2, 2, 2]
Nguồn
2011-01-03 13:03:13
Có thể lặp lại câu hỏi này: http://stackoverflow.com/questions/4443557/overloading-operator-for-arrays-in-groovy – Northover