Modül dersleri (5/5)
Sıralama paketiyle sıralama
Standart sort paketi dilimleri yerinde sıralar. Baz türleri için
(int, float64, string) doğrudan yardımcılar vardır; başka bir dilim için
sort.Slice işlevini tanımlayan bir less(i, j int) bool işleviyle kullanın.
Sipariş vermek.
Temel türler için yardımcılar
import "sort"
nums := []int{5, 2, 8, 1}
sort.Ints(nums) // [1 2 5 8]
words := []string{"c", "a", "b"}
sort.Strings(words) // [a b c]
fs := []float64{1.5, 0.5, 2.5}
sort.Float64s(fs) // [0.5 1.5 2.5]Sıralama yerindedir: Orijinal dilim mutasyona uğramıştır.
sort.Slice: özel sıralama
Dilimi ve less işlevini iletirsiniz; bu, iki dizin verildiğinde i ve
j, i öğesinin j'den önce gelmesi gerekiyorsa true değerini döndürür:
type Person struct {
Name string
Age int
}
people := []Person{
{"Bruno", 30},
{"Anna", 25},
{"Carla", 28},
}
sort.Slice(people, func(i, j int) bool {
return people[i].Age < people[j].Age
})
// Anna(25), Carla(28), Bruno(30)Tersine sıralamak için karşılaştırmayı ters çevirmeniz yeterlidir:
return people[i].Age > people[j].Age.
Kararlı sıralama
sort.Slice'nin kararlı olduğu garanti edilmez ("eşit" öğeler değişebilir)
göreceli sıra). Kararlı bir sıralama için sort.SliceStable kullanın:
sort.SliceStable(people, func(i, j int) bool {
return people[i].Age < people[j].Age
})Birden çok tuşa göre sıralama
Ortak kalıp: Yaşa göre sıralayın ve eşit yaşlar için ada göre sıralayın:
sort.Slice(people, func(i, j int) bool {
if people[i].Age != people[j].Age {
return people[i].Age < people[j].Age
}
return people[i].Name < people[j].Name
})İkili arama
sort.SearchInts / sort.Search önceden sıralanmış dilimler üzerinde çalışır:
nums := []int{1, 3, 5, 7, 9}
i := sort.SearchInts(nums, 5) // 2Öğe orada değilse ekleme dizinini döndürür. Kazabilirsin İhtiyacınız olduğunda ayrıntılara girin.
Jenerikler (1.21+ sürümüne geçin): slices.Sort
Stdlib'deki slices paketinden (Go 1.21):
import "slices"
nums := []int{3, 1, 2}
slices.Sort(nums) // [1 2 3]
slices.SortFunc(people, func(a, b Person) int {
return a.Age - b.Age // -1/0/1
})Daha modern, tür açısından güvenli API. sort.Slice ile uyumlu ancak daha fazlası
ergonomik.
Deneyin
sort.Ints'i kullanarak sayıları artan düzende sıralayın.
İpucu göster
'sort.Ints' int dilimini yerinde sıralar.
3 denemeden sonra çözüm mevcut
sort.Slice'ı kullanarak insanları Yaşa göre artan düzende sıralayın.
İpucu göster
less işlevi, i öğesinin j'den ÖNCE gelmesi gerektiğinde true değerini döndürür.
3 denemeden sonra çözüm mevcut
sort.Slice ile azalan düzende nasıl sıralama yaparsınız?
sort.Slice(s, func(i, j int) bool { return ??? })Özet
- Temel türler için yerinde
sort.Ints/sort.Strings/sort.Float64s. less(i, j)işleviyle her türden dilim içinsort.Slice(s, less).sort.SliceStableeşit anahtarların göreli sırasını korumak için.- Birden fazla anahtara göre sıralama:
lessiçindekiif'lerden oluşan bir basamak. - 1.21+ sürümüne geçin: Genel bir API içeren
slicespaketi (slices.Sort,slices.SortFunc). - Harita anahtarları için: bir dilime çıkarın ve sıralayın.