2011-11-20 14 views
8

Come posso ordinare una raccolta in base a due criteri in Cincom VisualWorks?Smalltalk: ordina una collezione in base a due criteri

Esempio: Ho un OrderedCollection che contiene persone e voglio una nuova raccolta che classifichi le persone prima per età, e poi se l'età è la stessa le persone per nome.

Spero che tu possa capire il mio inglese! Thanks ..

risposta

8

codice di Sean va bene, ma io preferisco scritto in questo modo, che è più intenzione -revealing e un po 'più efficiente:

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

l'idea è che il blocco di tipo deve rispondere vero se l'oggetto asorta prima voce b. Con due chiavi di considerare, un elemento sorta prima di un altro articolo se sia sua chiave primaria (age) è minore, o la chiave primaria è lo stesso, e la chiave secondaria (name) è inferiore.

Questo si traduce direttamente nel codice di cui sopra e può essere facilmente esteso a un terzo o più criteri di ordinamento (ad esempio, la chiave secondaria è inferiore oppure è la stessa e la chiave terziaria è inferiore).

+0

Preferisco anche così :) –

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

Travis Griggs implementato un modo interessante di fare questo tipo di ordinamento in un modo molto più succinta. Ha pubblicato il suo lavoro come TAG-SortFunctions nel Cincom Public Repository e credo che sia stato integrato nella prossima versione di VisualWorks. Vedi his blog post on the topic e the followup per dettagli. Con questo pacchetto, si dovrebbe semplicemente scrivere qualcosa di simile (non testata):

persone sorta: #age sortUp, #name sortUp

+0

Questo è abbastanza bello –

+0

Come ha detto Alan, questo è stato integrato in VisualWorks 7.8 ma l'API è cambiata. Invece di #sortUp e #sortDown, devi usare #ascending e #descending! Puoi anche inviare entrambi i selettori a Blocchi anziché Simboli, come in "[: each | each address city] in ordine crescente". – Karsten

6

Che Randy ha detto, ma si è integrato nel VisualWorks 7,8, e la sintassi sarebbe aCollection asSortedCollection: #age ascendente, discendente #name

dove è anche possibile utilizzare sorta :, o qualsiasi altra cosa che richiederebbero un sortBlock.