[Newbies] collection enumeration

Damien Cassou damien.cassou at laposte.net
Wed Aug 23 19:49:19 UTC 2006


Bert Freudenberg wrote:
> 
> 
> Am 23.08.2006 um 21:15 schrieb cdrick:
> 
>> Hi all -
>>
>> not an important question here, more a discussion. I was wondering
>> which method is the more appropriate (nice and/or efficient) to
>> enumerate all the elements of a collection and the index of each
>> elements...
>>
>>
>> (a) ---- à la C
>>
>> (1 to: collection size) do: [:index |
>>                         html render: 'Victime ', index printString.
>>                                                html render:
>> collection at: index]
>>
>> (b) --- indexOf
>>
>> collection do: [:victim |
>>                         html render: 'Victime ', (collection indexOf: 
>> victim) printString.
>>                                                html render: victim]
>>
>> (c) ---- keysAndValuesDo:
>>
>> collection keysAndValuesDo: [:index :victim |
>>                         html render: index printString.
>>                                                html render: member]
>>
>> (d) ---- using a local var
>>
>> | index |
>> index := 0.
>> collection do: [:victim | index := index + 1.
>>                         html render: 'Victime ', index printString.
>>                                                html render: victim]
>>
>> What solution would you suggest ?
>> I think we forget (a) and (d)
>> I like (c) but maybe (b) is more readable ?
>>
>> Maybe there is another way ?
> 
> (c), though I like #withIndexDo: better since it mimics the #with:do: 
> pattern.

I would vote for #withIndexDo: too which has in 'intention revealing 
name' :-)

And, please forget about (b), this is way too slow and wrong.

Slow because the complexity jump from O(n) to O(n²). Remember that 
#indexOf: has to search for the element in all the collection.

Wrong because:

collection := #($a $b $a).
collection
   do: [:each | Transcript
                  show: (collection indexOf: each);
                  space]

Will print '1 2 1' instead of '1 2 3'. Index answered by #indexOf: if 
the first index on which the object is found.


Bye


More information about the Beginners mailing list