2011-11-20 27 views
8

¿Cómo puedo ordenar una colección por dos criterios en Cincom VisualWorks?Smalltalk: Ordenar una colección por dos criterios

Ejemplo: Tengo una colección ordenada que contiene personas, y quiero una nueva colección que clasifique las personas primero por edad, y luego, si la edad es la misma, clasifique las personas por su nombre.

Espero que puedas entender mi inglés! Gracias ..

Respuesta

8

código de Sean está muy bien, pero yo prefiero que está escrito de esta manera, lo que es más intención -revealing y ligeramente más eficiente:

people sort: [ :a :b | 
    a age < b age 
     or: [a age = b age and: [ a name < b name ] ] 

la idea es que el bloque tipo debe responder a cierto si el artículo atipo antesb elemento. Con dos claves a considerar, un ítem tipo antes de que otro elemento si bien su clave primaria (age) es menor, o la clave principal es el mismo, y la clave secundaria (name) es menor.

Esto se traduce directamente en el código anterior, y se puede extender fácilmente a un tercer o más criterios de clasificación (por ejemplo, la clave secundaria es menor o es la misma y la clave terciaria es menor).

+0

Lo prefiero de esta manera también :) –

7
people sort: [ :a :b | 
    a age = b age 
     ifTrue: [ a name < b name ] 
     ifFalse: [ a age < b age ] ] 
9

Travis Griggs implementado una forma interesante de hacer este tipo de clase de una manera mucho más breve. Publicó su trabajo como TAG-SortFunctions en Cincom Public Repository, y creo que se ha integrado en la próxima versión de VisualWorks. Ver his blog post on the topic y the followup para más detalles. El uso de este paquete, sólo tendría que escribir algo como esto (no probado):

personas para ordenar: #age sortUp, #nombre sortUp

+0

Eso es genial –

+0

Como dijo Alan, esto se integró en VisualWorks 7.8 pero la API cambió. En lugar de #sortUp y #sortDown, necesitas usar #scending y #descending! También puede enviar ambos selectores a Bloques en lugar de Símbolos, como en "[: cada | ciudad de cada dirección] ascendente". – Karsten

6

Lo dijo Randy, pero se integra en VisualWorks 7.8, y la sintaxis sería unaColeccion asSortedCollection: ascendente #age, #nombre descendente

donde también se puede utilizar tipo :, o cualquier otra cosa que tomaría un sortBlock.

Cuestiones relacionadas