Flatten a Collection in Smalltalk

Collection-flattened.st

'From Pharo1.4 of 18 April 2012 [Latest update: #14457] on 27 September 2012 at 5:25 pm'!

!Collection methodsFor: 'converting' stamp: 'FranciscoAryMartins 9/27/2012 17:20'!
flattened
	| flattened |
	flattened := OrderedCollection new.
	self do: [:elem|
		elem isCollection
			ifTrue: [flattened addAll: elem flattened]
			ifFalse: [flattened add: elem]
	].
	^ flattened! !

A versão abaixo é melhor:

Collection-flattened.st

'From Pharo1.4 of 18 April 2012 [Latest update: #14457] on 27 September 2012 at 6:12:24 pm'!

!Collection methodsFor: 'converting' stamp: 'FranciscoAryMartins 9/27/2012 18:08'!
flattened
	| flattened |
	(flattened := self species new) isArray ifTrue: [flattened := OrderedCollection new].
	self do: [:elem|
		elem isCollection
			ifTrue: [flattened addAll: elem flattened]
			ifFalse: [flattened add: elem]
	].
	^ flattened! !

Ou ainda de forma mais uniforme:

Collection-flattened.st

'From Pharo1.4 of 18 April 2012 [Latest update: #14457] on 28 September 2012 at 7:44:41 am'!

!Collection methodsFor: 'converting' stamp: 'FranciscoAryMartins 9/28/2012 07:44'!
flattened
	| flattened isArray |
	isArray := self isArray.
	isArray
		ifTrue: [flattened := OrderedCollection new]
		ifFalse: [flattened := self species new].
	self do: [:elem|
		elem isCollection
			ifTrue: [flattened addAll: elem flattened]
			ifFalse: [flattened add: elem]
	].
	isArray ifTrue: [^ flattened asArray].
	^ flattened! !
Anúncios

Deixe um comentário

Preencha os seus dados abaixo ou clique em um ícone para log in:

Logotipo do WordPress.com

Você está comentando utilizando sua conta WordPress.com. Sair / Alterar )

Imagem do Twitter

Você está comentando utilizando sua conta Twitter. Sair / Alterar )

Foto do Facebook

Você está comentando utilizando sua conta Facebook. Sair / Alterar )

Foto do Google+

Você está comentando utilizando sua conta Google+. Sair / Alterar )

Conectando a %s