Collection standard methods

Lic. Edgar J. De Cleene edgardec2001 at yahoo.com.ar
Sun Sep 3 07:19:59 UTC 2006


stéphane ducasse puso en su mail :

> I think that it would be good to rethink and enlarge the collections
> methods.
> How explode is called in ruby?
> 
> Stef

'abcdef'  findTokens: 'cd' an OrderedCollection('ab' 'ef')
And was in Squeak for a loooong time.

> 
> On 2 sept. 06, at 19:25, Ron Teitelbaum wrote:
> 
>> Hello all,
>> 
>> I have some of my own collection methods that I have to keep
>> remembering not
>> to use for shared code.
>> 
>> What I need is a standard method for my Collection >> explode:
>> aDelimiter
>> method
>> 
>> Collection >> explode: aDelimiter
>> "explode the collection into a collection of collections broken by
>> aDelimiter"
>> "(#(#(1 2) #(3 4)) mergeDelimited: Character tab ) explode:
>> Character tab = an OrderedCollection(#(1 2) #(3 4))
>> 'abcdef' explode: 'cd' = an OrderedCollection('ab' 'ef')"
>> 
>> | resultCollection starting aDelimiterPosition aDelimiterSize |
>> 
>> self ifEmpty: [^self].
>> resultCollection _ OrderedCollection new.
>> aDelimiterSize _ aDelimiter isCollection ifTrue: [aDelimiter size]
>> ifFalse: [1].
>> starting _ 1.
>> [aDelimiterPosition _ aDelimiter isCollection ifTrue: [self
>> indexOfSubCollection: aDelimiter startingAt: starting] ifFalse: [self
>> indexOf: aDelimiter startingAt: starting ifAbsent: [0]].
>> aDelimiterPosition > 0] whileTrue: [
>> resultCollection add: (self copyFrom: starting to:
>> aDelimiterPosition - 1).
>> starting _ aDelimiterPosition + aDelimiterSize.
>> ].
>> resultCollection add: (self copyFrom: starting to: self size).
>> ^resultCollection
>> 
>> For reference:
>> 
>> Collection >> mergeDelimited: anObject
>> "return to reciever a collection with each element concatenated to
>> remove imbeded collections"
>> "#(#(1 2) #(3 4)) mergeDelimited: Character tab = #(1 2 Character
>> tab 3 4),  #('ab' 'cd') mergeDelimited: Character cr = 'ab
>> cd' "
>> | returnCollection aSeperator |
>> self ifEmpty: [^self].
>> aSeperator _ anObject isCollection ifTrue: [anObject] ifFalse:
>> [Array with: anObject].
>> returnCollection _ self first species new.
>> self copy from: 1 to: self size -1 do: [:a |
>> a ifNotNil: [
>> returnCollection _ returnCollection, a, aSeperator
>> ].
>> ].
>> ^returnCollection, self last.
>> 
>> And for completeness:
>> 
>> Collection >> merge
>> "return to reciever a collection with each element concatenated to
>> remove imbeded collections"
>> "#(#(1 2) #(3 4)) merge = #(1 2 3 4),  #('ab' 'cd') merge = 'abcd'"
>> | returnCollection |
>> self ifEmpty: [^self].
>> returnCollection _ self first species new.
>> self do: [:a |
>> a ifNotNil: [
>> returnCollection _ returnCollection, a
>> ].
>> ].
>> ^returnCollection
>> 
>> 
>> I've discussed adding my methods on mantis previously but I think the
>> reaction I got was collection was already too large.
>> 
>> The replacement for merge is gather:  but merge has an additional
>> feature in
>> that it creates collections in the type of the first element, which
>> means it
>> works for strings.
>> 
>> #('a' 'b' 'c') gather: [:a | a] #($a $b $c)
>> #('a' 'b' 'c') merge 'abc'
>> 
>> Otherwise it is similar.
>> 
>> #(#(1 2) #(3 4)) gather: [:a | a] #(1 2 3 4)
>> #(#(1 2) #(3 4)) merge #(1 2 3 4)
>> 
>> 
>> So back to my original question is there an explode: aDelimiter
>> method out
>> there that I missed?  There is a
>>        Collection>>asStringOn: aStream delimiter: delimString
>> but this doesn't meet my requirement for a collection of non string
>> elements
>> (including other collections).
>> 
>> Thanks,
>> 
>> Ron Teitelbaum
>> 
>> 
>> 
>> 
>> 
>> 
> 
> 



	
	
		
__________________________________________________
Preguntá. Respondé. Descubrí.
Todo lo que querías saber, y lo que ni imaginabas,
está en Yahoo! Respuestas (Beta).
¡Probalo ya! 
http://www.yahoo.com.ar/respuestas




More information about the Squeak-dev mailing list