2016-03-21 36 views
9

[UDPATE] colpa mia. Avrei dovuto leggere lo docs più accuratamente di fare questa domanda subito. Colpa mia.Golang: come ordinare la struct con più parametri di ordinamento?

Ho un allineamento/fetta di membri:

type Member struct { 
    Id int 
    LastName string 
    FirstName string 
} 

var members []Member 

La mia domanda è come ordinare loro da LastName e poi da FirstName.

Qualsiasi aiuto è apprezzato grazie.

+0

Hai dato un'occhiata all'esempio fornito nella documentazione ufficiale per ordinare i pacchetti? https://golang.org/pkg/sort/#example__sortMultiKeys – Volker

+0

Da Go 1.8, la risposta di @abourget è migliore (perché più breve) rispetto a quella attualmente accettata. – AndreKR

risposta

19

Utilizzare la funzione sort.Sort per ordinare la porzione di membri. Implementare l'interfaccia di ordinamento con una funzione Less che confronta LastName e quindi FirstName.

type byLastFirst []Member 

func (a byLastFirst) Len() int   { return len(a) } 
func (a byLastFirst) Swap(i, j int)  { a[i], a[j] = a[j], a[i] } 
func (a byLastFirst) Less(i, j int) bool { 
    if a[i].LastName < a[j].LastName { 
     return true 
    } 
    if a[i].LastName > a[j].LastName { 
     return false 
    } 
    return a[i].FirstName < a[j].FirstName 
} 

sort.Sort(byLastFirst(members)) 
+0

Grazie mille @MuffinTop Funziona perfettamente. – Melvin

12

Utilizzare la funzione più recente sort.Slice come tale:

sort.Slice(members, func(i, j int) bool { 
    switch strings.Compare(members[i].FirstName, members[j].FirstName) { 
    case -1: 
     return true 
    case 1: 
     return false 
    } 
    return members[i].LastName > members[j].LastName 
}) 

o qualcosa di simile.

+4

si dovrebbe ricordare che questo è disponibile solo da Go 1.8 – Yerken

+1

Non utilizzare stringhe.Compare. La documentazione su https://golang.org/pkg/strings/#Compare dice "Il confronto è incluso solo per la simmetria con i byte del pacchetto. Di solito è più chiaro e sempre più veloce utilizzare gli operatori di confronto delle stringhe incorporati ==, <, >, e così via." – nishanths

+1

E se è possibile che sia il cognome che il nome possano essere gli stessi per due membri e si desidera mantenere l'ordine originale della sezione, si dovrebbe usare 'sort.Stable' o' sort.SliceStable'. – nishanths

Problemi correlati