Go言語 - ソート
sortパッケージで、int,float64,stringのスライスについての小さい順のソートが可能。
逆順が欲しい場合は予め定義されているスライス型(intならIntSlice)にしてからsort.Sort(sort.Reverse(x))とする必要がある。でも、普通にソートして並べ替えた方が単純に思える。
package main import ( "fmt" "sort" ) func main() { a := []int{2,4,6,5,3,1} fmt.Println(a) fmt.Println( sort.IntsAreSorted(a) ) //-> false ソート済みならtrue sort.Ints(a) fmt.Println(a) //-> [1 2 3 4 5 6] fmt.Println(sort.IntsAreSorted(a)) //-> true sort.Sort(sort.Reverse(sort.IntSlice(a))) fmt.Println(a) //-> [6 5 4 3 2 1] }
新しい型のソート
新しく定義した型のソートを行う場合は、インターフェースで定義されている3つの関数を作成する必要がある。
type Interface interface { Len() int Less(i, j int) bool Swap(i, j int) }
以下は、[]intをmyint型に定義して、3に近い順のソートを行う例。
package main import ( "fmt" "sort" ) type myint []int func(a myint) Len() int { return len(a) } func(a myint) Less(i, j int) bool { return myAbs(3 - a[i]) < myAbs(3 - a[j]) // 3に近い方が小 // return a[i] < a[j] } func(a myint) Swap(i, j int) { t := a[i] a[i] = a[j] a[j] = t return } // 絶対値を求める func myAbs(x int) int { if x < 0 { x = x * -1} return x } func main() { // 3に近い順のソート b := myint{12,-1,2,4,6,5,3,1} fmt.Println(b) sort.Sort(b) fmt.Println(b) //-> [3 2 4 5 1 6 -1 12] }