hakeの日記

Windows環境でプログラミングの勉強をしています。

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]

}