As for Dinko's note that transpose is on List -- I don't know how I've missed 
it -- I had been looking for this feature in Groovy a long time (under the name 
of "zip" like it's found in Python). Maybe it's because I normally check 
Iterable and Collection added methods more often than list. I would second 
Schalk's comment about adding a zip function that works with Iterable/Iterator. 
Whether or not it should match with "null" when one iterator is longer than the 
other is up for debate, but both transpose in Groovy and zip in Python both 
ignore any "extra" elements, although there is a zip_longest() in Python that 
takes a "fill value" to use. I'd propose the method is defined so any of the 
following work:

zip(a, b)
a.zip(b)
zip(a, b,c,d)
a.zip(b,c,d)

I think that would be compatible with Groovy extension methods if it's defined 
as:

static <T> Iterable<T> zip(Iterable<? extends T> self, Iterable<? extends T>... 
others)

Jason

-----Original Message-----
From: Schalk Cronjé [mailto:ysb...@gmail.com] 
Sent: Friday, October 02, 2015 5:22 AM
To: users@groovy.incubator.apache.org
Subject: Re: Iterate over 2 lists in a closure?

This thread made me think a zip iterator could be a useful addition to the 
language.

   def myList = [1,2,3]
   def myMap = [ a:'b', c:'d', e:'f' ]
   zip(myList,myMap).each { l,m -> println "$l $m" }

Prints out
   1 a=b
   2 c=d
   3 e=f

If one collection is exhausted, whilst the other is not, then just return 
'null' for the additional items.


On 02/10/2015 09:44, Dinko Srkoč wrote:
> On 1 October 2015 at 19:47, Winnebeck, Jason
> <jason.winneb...@windstream.com> wrote:
>> [...]
>> This also sounds like a zip operation, which took me a really long time to
>> find in Groovy but I recently found it:
>>
>>
>>
>> def letters = ['a', 'b']
>> def numbers = [1, 2]
>>
>> assert ['a1', 'b2'] ==
>>         GroovyCollections.transpose(letters, numbers).collect { it[0] + it[1]
>> }
>>
> There's an easier way to use `transpose`:
>
>    assert ['a1', 'b2'] == [letters, numbers].transpose()*.join('')
>
> Cheers,
> Dinko
>
>>
>> In your case of testing a condition (equality) you can use any method
>> instead of collect.
>>
>>
>>
>> Jason
>>
>>
>>
>> From: Owen Rubel [mailto:oru...@gmail.com]
>> Sent: Thursday, October 01, 2015 1:28 PM
>> To: users@groovy.incubator.apache.org
>> Subject: Re: Iterate over 2 lists in a closure?
>>
>>
>>
>> if(list1.contains(list2) && list2.contains(list1)){ true }
>>
>>
>> Owen Rubel
>> 415-971-0976
>> oru...@gmail.com
>>
>>
>>
>> On Thu, Oct 1, 2015 at 10:22 AM, Les Hartzman <lhartz...@gmail.com> wrote:
>>
>> Hi,
>>
>>
>>
>> I want to know if it's possible to have a closure that can iterate over 2
>> equal length lists? The equivalent of doing list1.each, list2.each { ... },
>> where each list is a list of an user-defined type.
>>
>>
>>
>> Basically I want to compare elements in the lists to see if they are equal.
>>
>>
>>
>> Thanks.
>>
>>
>>
>> Les
>>
>>
>>
>>
>>
>> ________________________________
>> This email message and any attachments are for the sole use of the intended
>> recipient(s). Any unauthorized review, use, disclosure or distribution is
>> prohibited. If you are not the intended recipient, please contact the sender
>> by reply email and destroy all copies of the original message and any
>> attachments.


-- 
Schalk W. Cronjé
Twitter / Ello / Toeter : @ysb33r


----------------------------------------------------------------------
This email message and any attachments are for the sole use of the intended 
recipient(s). Any unauthorized review, use, disclosure or distribution is 
prohibited. If you are not the intended recipient, please contact the sender by 
reply email and destroy all copies of the original message and any attachments.

Reply via email to