Skip to content

sort

TIP

1.21 버전 이상의 개발자라면 slices 표준 라이브러리를 사용하여 정렬하는 것을 권장합니다. 이는 제네릭을 지원하며 API 설계가 더욱 합리적입니다.

Go 의 sort 패키지에서는 공식 구현 정렬 메서드를 제공하며, 대부분은 바로 사용할 수 있습니다. 구조체를 정렬하려면 sort.Interface 의 세 가지 메서드 Len(), Swap(), Less() 를 구현해야 합니다. 공식에서 이미 Float64Slice, StringSlice, IntSlice 세 가지 유형을 구현해 두었으므로 이 세 가지 유형은 직접 사용할 수 있습니다.

go
type Interface interface {
   // 길이 메서드
   Len() int

   // 비교 메서드
   Less(i, j int) bool

   // 교환 메서드
   Swap(i, j int)
}

정수 정렬

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

부동소수점 정렬

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

문자열 정렬

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

역순 정렬

먼저 sort.Reverse 로 감싼 후 정렬해야 합니다.

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

사용자 정의 정렬

구조체를 사용자 정의하여 정렬하려면 세 가지 메서드를 구현해야 합니다.

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

type PersonSlice []Person

// 슬라이스 길이 반환
func (p PersonSlice) Len() int {
  return len(p)
}

// 비교 메서드
func (p PersonSlice) Less(i, j int) bool {
  return p[i].Age < p[j].Age
}

// 교환 메서드
func (p PersonSlice) Swap(i, j int) {
  p[i], p[j] = p[j], p[i]
}

나이로 비교하므로 결과는 나이에 따라 정렬됩니다.

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

정렬 여부 확인

슬라이스가 정렬되었는지 판단하며, 내부적으로 정렬 작업을 수행하지 않고 Less() 를 순환 호출하여 판단합니다.

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