2016-03-21 7 views
9

[UDPATE]私のせいです。すぐにこの質問をするよりも、私はdocsをもっと徹底的に読んでいたはずです。私の悪い。Golang:複数のソートパラメータを使用して構造体をソートする方法は?

私はメンバーの配列/スライスを持っている:

type Member struct { 
    Id int 
    LastName string 
    FirstName string 
} 

var members []Member 

私の質問はFirstNameによってLastNameし、その後でそれらをソートする方法です。

ご協力いただきありがとうございます。

+0

ソートをパッケージ化するための公式文書に記載されている例を見ましたか? https://golang.org/pkg/sort/#example__sortMultiKeys – Volker

+0

Go 1.8以降、@ abourgetの答えは現在受け入れられているよりも優れています(短いため)。 – AndreKR

答えて

19

sort.Sort機能を使用して、メンバーのスライスをソートします。 LastNameとFirstNameを比較するLess関数でソートインターフェイスを実装します。

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

ありがとうございます@MuffinTopそれは完璧に動作します。 – Melvin

12

などの新しいsort.Slice機能を使用します

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

またはそのような何かを。

+4

これは、Go 1.8以降でのみ使用可能であることを言及する必要があります。 – Yerken

+1

strings.Compareを使用しないでください。 https://golang.org/pkg/strings/#Compareにあるドキュメントには、「比較はパッケージバイトの対称性にのみ含まれています。組み込みの文字列比較演算子==、<, >、等々。" – nishanths

+1

2人のメンバーの姓と名が同じで、スライスの元の順序を保持したい場合は、 'sort.Stable'または' sort.SliceStable'を使用してください。 – nishanths

関連する問題