はじめに
Go標準のsortパッケージでは、スライスの並び替えなどをサポートしています。
本記事では、sortパッケージで一般的に利用される関数を紹介していきます。
Ints
int型のスライスを昇順で並び替えます。
go
package main
import (
"fmt"
"sort"
)
func main() {
s := []int{5, 2, 3, 1, 4}
sort.Ints(s)
fmt.Println(s) //=> [1 2 3 4 5]
}
一般的なソート(バブルソート)と比較してみます。
go
package main
import "fmt"
func main() {
s := []int{5, 2, 3, 1, 4}
for i := 0; i < len(s)-1; i++ {
for j := 0; j < len(s)-1-i; j++ {
if s[j] > s[j+1] {
s[j], s[j+1] = s[j+1], s[j]
}
}
}
fmt.Println(s) //=> [1 2 3 4 5]
}
Intsを使うだけでも、かなりのコード量を削減できますね。
Strings
string型のスライスを昇順で並び替えます。
go
package main
import (
"fmt"
"sort"
)
func main() {
s := []string{"A", "C", "ab", "aa", "B"}
sort.Strings(s)
fmt.Println(s) //=> [A B C aa ab]
}
Slice
第2引数で渡した関数の処理を条件として、スライスを並び替えます。
若干ややこしいので、コードも交えて説明します。
go
package main
import (
"fmt"
"sort"
)
func main() {
people := []struct {
Name string
Age int
}{
{"Gopher", 7},
{"Alice", 55},
{"Vera", 24},
{"Bob", 75},
}
sort.Slice(people, func(i, j int) bool { return people[i].Name < people[j].Name })
fmt.Println(people) //=> [{Alice 55} {Bob 75} {Gopher 7} {Vera 24}]
}
第2引数で渡した関数内で、for文が2重で実行されていると考えてください。
people[i].Name
とpeople[j].Name
を比較し、小さい要素を前に持ってくるイメージです。
Ageで並び替えたい場合は、Nameの箇所をAgeに変更してください。
まとめ
アウトプット感覚で書きましたが、ご満足いただけたら幸いです。
Goを触り初めて1週間のド素人ですので、間違いなどがありましたら指摘していただけると助かります。
参考