Skip to content

sort

TIP

Jika Anda adalah pengembang versi 1.21 atau lebih tinggi, saya sarankan menggunakan pustaka standar slices untuk pengurutan, karena mendukung generik dan desain API yang lebih masuk akal.

Package sort di Go menyediakan metode pengurutan yang diimplementasikan secara resmi, sebagian besar dapat langsung digunakan. Jika ingin mengurutkan struct, harus mengimplementasikan tiga metode Len() Less() Swap() di bawah sort.Interface. Karena官方 sudah mengimplementasikan tiga tipe Float64Slice StringSlice IntSlice untuk kita, jadi ketiga tipe ini dapat langsung digunakan tanpa perlu mengimplementasikannya sendiri.

go
type Interface interface {
   // Metode panjang
   Len() int

   // Metode perbandingan
   Less(i, j int) bool

   // Metode pertukaran
   Swap(i, j int)
}

Pengurutan Integer

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

Pengurutan Floating Point

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

Pengurutan String

go
func main() {
   strings := []string{"helloworld", "aaa", "bbb", "ccc"}
   sort.Strings(strings)
}

Pengurutan Terbalik

Perlu dikemas dengan sort.Reverse terlebih dahulu sebelum melakukan pengurutan

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

Pengurutan Kustom

Jika ingin mengurutkan struct secara kustom, harus mengimplementasikan tiga metode.

go
type Person struct {
  UserId   string
  Username string
  Age      int
  Address  string
}

type PersonSlice []Person

// Mengembalikan panjang slice
func (p PersonSlice) Len() int {
  return len(p)
}

// Metode perbandingan
func (p PersonSlice) Less(i, j int) bool {
  return p[i].Age < p[j].Age
}

// Metode pertukaran
func (p PersonSlice) Swap(i, j int) {
  p[i], p[j] = p[j], p[i]
}

Karena perbandingan berdasarkan usia, hasilnya diurutkan berdasarkan besar kecilnya usia.

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

Apakah Terurut

Menentukan apakah sebuah slice terurut, secara internal tidak akan melakukan operasi pengurutan, tetapi melalui loop memanggil Less() untuk menentukan

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