Skip to content

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.

go
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

go
func main() {
   ints := []int{1, 2, 3, 111, 5, 99, 23, 5, 66}
   sort.Ints(ints)
}

Kayan Nokta Sıralama

go
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

go
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

go
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.

go
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.

go
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

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

Golang by www.golangdev.cn edit