2016-03-21 9 views
9

[UDPATE] Meine Schuld. Ich hätte die docs gründlicher lesen sollen, als diese Frage sofort zu stellen. Mein Fehler.Golang: Wie struct mit mehreren Sortierparametern sortieren?

Ich habe eine Array/Scheibe der Mitglieder:

type Member struct { 
    Id int 
    LastName string 
    FirstName string 
} 

var members []Member 

Meine Frage ist, wie man sich von LastName zu sortieren und dann von FirstName.

Jede Hilfe ist dankbar, danke.

+0

Haben Sie sich das Beispiel in der offiziellen Dokumentation zur Paketsortierung angesehen? https://golang.org/pkg/sort/#example__sortMultiKeys – Volker

+0

Seit Go 1.8 ist die Antwort von @ abourget besser (weil kürzer) als die aktuell akzeptierte Antwort. – AndreKR

Antwort

19

Verwenden Sie die Funktion sort.Sort, um die Mitgliederscheibe zu sortieren. Implementieren Sie die Sortierschnittstelle mit einer Less-Funktion, die LastName und dann FirstName vergleicht.

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

Vielen Dank @MuffinTop Es funktioniert perfekt. – Melvin

12

Verwenden Sie die neuere sort.Slice Funktion als solche:

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 
}) 

oder so ähnlich.

+4

sollten Sie erwähnen, dass dies nur seit Go 1.8 verfügbar ist – Yerken

+1

Verwenden Sie nicht strings.Compare. Die Dokumentation unter https://golang.org/pkg/strings/#Compare sagt "Compare ist nur für Symmetrie mit Paket-Bytes enthalten. Es ist in der Regel klarer und immer schneller, die integrierten String-Vergleichsoperatoren zu verwenden ==, <, >, und so weiter." – nishanths

+1

Und wenn es möglich ist, dass sowohl der Nachname als auch der Vorname für zwei Mitglieder identisch sein können und Sie die ursprüngliche Reihenfolge des Slices beibehalten möchten, sollten Sie 'sort.Stable' oder' sort.SliceStable' verwenden. – nishanths

Verwandte Themen