sort
TIP
バージョン 1.21 以上の開発者の場合、slices 標準ライブラリを使用してソートすることをお勧めします。ジェネリクスをサポートし、API 設計がより合理的です。
Go の sort パッケージでは、公式実装のソートメソッドが提供されており、その大部分はすぐに使用できます。構造体をソートするには、sort.Interface の 3 つのメソッド Len()、Swap()、Less() を実装する必要があります。公式はすでに Float64Slice、StringSlice、IntSlice の 3 つのタイプを実装してくれているため、これら 3 つのタイプは自分で実装せずに直接使用できます。
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)
}カスタムソート
構造体をカスタムソートするには、3 つのメソッドを実装する必要があります。
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)))
}