Prototype (инфраструктура JavaScript) имеет метод zip()
, который делает именно то, что вам нужно. Хотя это тебе не поможет, я знаю. Забавно, я ожидал, что в Groovy будет что-то подобное, но я не смог найти ничего ни в Collection
или List
.
Во всяком случае, вот не слишком красивая реализация 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;
}
И вот он в действии:
def list1 = [1, 1, 1]
def list2 = [1, 1, 1]
print (list1.zip(list2) {it1, it2 -> it1 + it2})
Выход:
[2, 2, 2]
Конечно, вы также можете сделать это менее общим способом, если хотите решить именно свою проблему (а не реализовывать общую функцию zip/map):
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]
person
Sean Patrick Floyd
schedule
03.01.2011