モジュールのレッスン (5/5)
ソートパッケージを使用したソート
標準の sort パッケージは、その場でスライスを並べ替えます。ベースタイプの場合
(int、float64、string) 直接ヘルパーがあります。他のスライスについては、
sort.Slice を、
注文すること。
基本型のヘルパー
import "sort"
nums := []int{5, 2, 8, 1}
sort.Ints(nums) // [1 2 5 8]
words := []string{"c", "a", "b"}
sort.Strings(words) // [a b c]
fs := []float64{1.5, 0.5, 2.5}
sort.Float64s(fs) // [0.5 1.5 2.5]並べ替えは インプレース です。元のスライスは変更されます。
sort.Slice: カスタム並べ替え
スライスと less 関数を渡します。この関数には、i と 2 つのインデックスが与えられます。
j は、要素 i が j の前に来る必要がある場合に true を返します。
type Person struct {
Name string
Age int
}
people := []Person{
{"Bruno", 30},
{"Anna", 25},
{"Carla", 28},
}
sort.Slice(people, func(i, j int) bool {
return people[i].Age < people[j].Age
})
// Anna(25), Carla(28), Bruno(30)逆に並べ替えるには、比較を反転するだけです。
return people[i].Age > people[j].Age。
安定したソート
sort.Slice は安定していることが保証されていません (「等しい」要素は変更される可能性があります)
相対的な順序)。安定した並べ替えを行うには、sort.SliceStable を使用します。
sort.SliceStable(people, func(i, j int) bool {
return people[i].Age < people[j].Age
})複数のキーによる並べ替え
一般的なパターン: 年齢順に並べ替え、同じ年齢の場合は名前順に並べ替えます。
sort.Slice(people, func(i, j int) bool {
if people[i].Age != people[j].Age {
return people[i].Age < people[j].Age
}
return people[i].Name < people[j].Name
})二分探索
sort.SearchInts / sort.Search は、すでにソートされたスライスに対して動作します。
nums := []int{1, 3, 5, 7, 9}
i := sort.SearchInts(nums, 5) // 2要素が存在しない場合は、挿入インデックスを返します。掘ることができます 必要なときに詳細を確認できます。
ジェネリック (Go 1.21 以降): slices.Sort
stdlib (Go 1.21) の slices パッケージから:
import "slices"
nums := []int{3, 1, 2}
slices.Sort(nums) // [1 2 3]
slices.SortFunc(people, func(a, b Person) int {
return a.Age - b.Age // -1/0/1
})よりモダンでタイプセーフな API。 sort.Slice と互換性がありますが、それ以上
人間工学に基づいた。
試してみてください
sort.Ints を使用して数値を昇順に並べ替えます。
ヒントを表示
`sort.Ints` は int スライスをその場でソートします。
3 回の試行後に解決策が利用可能になります
sort.Slice を使用して、人々を年齢で昇順に並べ替えます。
ヒントを表示
要素 i が j の前に来る必要がある場合、less 関数は true を返します。
3 回の試行後に解決策が利用可能になります
sort.Slice で降順に並べ替えるにはどうすればよいですか?
sort.Slice(s, func(i, j int) bool { return ??? })要約
sort.Ints/sort.Strings/sort.Float64s(基本型の場合、インプレース)。less(i, j)関数を使用した、任意のタイプのスライスのsort.Slice(s, less)。sort.SliceStableは、等しいキーの相対順序を保持します。- 複数のキーによる並べ替え:
less内のifのカスケード。 - Go 1.21+: 汎用 API (
slices.Sort、slices.SortFunc) を備えたslicesパッケージ。 - マップキーの場合: スライスに抽出してソートします。