Collection standard methods

Ron Teitelbaum Ron at USMedRec.com
Sat Sep 2 17:25:29 UTC 2006


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



 




More information about the Squeak-dev mailing list