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