package main
import (
"sort"
"fmt"
)
type ByLength []string
func (s ByLength) Len() int {
return len(s)
}
func (s ByLength) Swap(i, j int) {
s[i], s[j] = s[j] , s[i]
}
func (s ByLength) Less(i, j int) bool {
return len(s[i]) < len(s[j])
}
func main() {
fruits := []string{"peach", "banana", "kiwi"}
sort.Sort(ByLength(fruits))
fmt.Println(fruits)
}
Custom 정렬 함수를 만들기 위해서는 그에 맞는 타입을 준비해야 한다. 예제에서는 []string 타입의 alias인 ByLength타입을 만들었다.
이제 sort의 interface인 Len, Less, Swap를 ByLength에 구현하면 된다. 일종의 제너릭(generic) 함수의 구현이라고 보면 된다. 보통 문자열을 정렬 할경우 Less() 메서드는 단순 string 비교를 할 것이다. 여기에서는 len() 내장 함수를 이용해서 문자열의 길이를 가져오고 이것을 비교하고 있다.
main() 함수에서 ByLength 슬라이스인 fruits를 만들어서 정렬을 했다. 오름차순으로 정렬되는 걸 확인 할 수 있을 것이다. Less메서드를 Len(s[i]) > len(s[j])로 바꾸는 것만으로 내림차순 정렬로 바꿀 수 있다. 테스트해보자.
아래는 구조체 타입에 대한 정렬 예제다.
예제로 살펴보는 Go : Sorting by Functions
package main import ( "sort" "fmt" ) type ByLength []string func (s ByLength) Len() int { return len(s) } func (s ByLength) Swap(i, j int) { s[i], s[j] = s[j] , s[i] } func (s ByLength) Less(i, j int) bool { return len(s[i]) < len(s[j]) } func main() { fruits := []string{"peach", "banana", "kiwi"} sort.Sort(ByLength(fruits)) fmt.Println(fruits) }package main import ( "fmt" "sort" ) type Person struct { Name string Id int } type Persons []Person func (self Persons) Len() int { return len(self) } func (self Persons) Swap(i, j int) { self[i], self[j] = self[j], self[i] } func (self Persons) Less(i, j int) bool { return self[i].Id < self[j].Id } func (self Persons) Sort() { sort.Sort(Persons(self)) fmt.Println(self) } func main() { data := Persons{ {"ab", 33}, {"hong", 21}, {"kim", 38}, {"Tei", 29}, {"Tom", 28}, } data.Sort() }Recent Posts
Archive Posts
Tags