sort
TIP
Eğer 1.21 veya üzeri bir sürüm kullanıyorsanız, sıralama için slices standart kütüphanesini kullanmanızı öneririm, generic'leri destekler ve API tasarımı daha mantıklıdır.
Go'daki sort paketi resmi olarak implement edilmiş sıralama metodları sağlar, çoğu doğrudan kullanılabilir. Eğer bir struct'ı sıralamak istiyorsanız sort.Interface altındaki üç metodu Len(), Swap(), Less() implement etmeniz gerekir. Resmi olarak zaten Float64Slice, StringSlice, IntSlice olmak üzere üç tip implement edildiğinden, bu üç tipi doğrudan kullanabilirsiniz.
type Interface interface {
// Uzunluk metodu
Len() int
// Karşılaştırma metodu
Less(i, j int) bool
// Değiştirme metodu
Swap(i, j int)
}Tamsayı Sıralama
func main() {
ints := []int{1, 2, 3, 111, 5, 99, 23, 5, 66}
sort.Ints(ints)
}Kayan Nokta Sıralama
func main() {
floats := []float64{1.0, 2.5, 3.8, 1.11, 5.5, 99.99999, 23.9999, 5.66, 66}
sort.Float64s(floats)
fmt.Println(floats)
}String Sıralama
func main() {
strings := []string{"helloworld", "aaa", "bbb", "ccc"}
sort.Strings(strings)
}Ters Sıralama
Önce sort.Reverse ile sarmalanmalı, ardından sıralanmalıdır
func main() {
floats := []float64{1.0, 2.5, 3.8, 1.11, 5.5, 99.99999, 23.9999, 5.66, 66}
sort.Sort(sort.Reverse(sort.Float64Slice(floats)))
fmt.Println(floats)
}Özel Sıralama
Eğer özel bir struct'ı sıralamak istiyorsanız, üç metodu implement etmeniz gerekir.
type Person struct {
UserId string
Username string
Age int
Address string
}
type PersonSlice []Person
// Slice'ın uzunluğunu döndür
func (p PersonSlice) Len() int {
return len(p)
}
// Karşılaştırma metodu
func (p PersonSlice) Less(i, j int) bool {
return p[i].Age < p[j].Age
}
// Değiştirme metodu
func (p PersonSlice) Swap(i, j int) {
p[i], p[j] = p[j], p[i]
}Yaşa göre karşılaştırma yapıldığından, sonuçlara göre yaşa göre sıralanır.
func main() {
persons := []Person{{
UserId: "1",
Username: "wyh",
Age: 18,
Address: "us",
}, {
UserId: "2",
Username: "jack",
Age: 17,
Address: "ch",
}, {
UserId: "3",
Username: "mike",
Age: 15,
Address: "india",
}}
sort.Sort(PersonSlice(persons))
fmt.Println(persons)
}Sıralı mı?
Bir slice'ın sıralı olup olmadığını kontrol eder, içsel olarak sıralama işlemi yapmaz, bunun yerine Less() metodunu döngüyle çağırarak kontrol eder
func main() {
persons := []Person{{
UserId: "1",
Username: "wyh",
Age: 18,
Address: "us",
}, {
UserId: "2",
Username: "jack",
Age: 17,
Address: "ch",
}, {
UserId: "3",
Username: "mike",
Age: 15,
Address: "india",
}}
sort.Sort(PersonSlice(persons))
println(sort.IsSorted(PersonSlice(persons)))
}