2016-03-21 29 views
9

[UDPATE] Arızam. Bu soruyu hemen sormaktan docs daha ayrıntılı okumalıydım. Benim hatam.Golang: Yapı, birden çok sıralama parametresiyle nasıl sıralanır?

Ben üyelerinin dizisi/dilim:

type Member struct { 
    Id int 
    LastName string 
    FirstName string 
} 

var members []Member 

Sorum FirstName tarafından daha sonra LastName göre sıralamak ve nasıl olduğunu.

Her türlü yardım için teşekkür ederiz.

+0

Resmi belgede verilen örnekte, paket sıralaması için bir örnek var mı? https://golang.org/pkg/sort/#example__sortMultiKeys – Volker

+0

Go 1.8'den beri, @ abourget'in cevabı şu anda kabul edilen olandan daha iyidir (çünkü daha kısadır). – AndreKR

cevap

19

Üye dilimlerini sıralamak için sort.Sort işlevini kullanın. Sıralama arabirimini LastName ve sonra FirstName öğelerini karşılaştıran Less işleviyle uygulayın.

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

Çok teşekkürler @MuffinTop Mükemmel çalışıyor. – Melvin

12

gibi yeni sort.Slice işlevini kullanın: Böyle

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

falan.

+4

Bu sadece Go 1.8 – Yerken

+1

dizeleri kullanmıyor olduğundan bahsetmelisiniz. Https://golang.org/pkg/strings/#Compare adresindeki belgeler, "Karşılaştırma, yalnızca paket baytları ile simetri için dahil edilmiştir. Genellikle dahili dize karşılaştırma operatörleri ==, <, >'u kullanmak daha net ve her zaman daha hızlıdır." ve bunun gibi." – nishanths

+1

Hem soyad hem de ilk adın iki üye için aynı olması ve dilimin orijinal sırasını korumak istiyorsanız, 'sort.Stable' veya' sort.SliceStable' kullanmalısınız. – nishanths

İlgili konular