疑問
データをsortした時に文字列はどのような基準で順番が決められるのか。
結論
標準ではUnicodeコードポイントを判定して、sortをした時に順番が決まる。
実装
package main
import (
"fmt"
"log"
"sort"
)
type Person struct {
FirstName string
LastName string
Age int
}
func main() {
people := []Person{
{"Bob", "lob", 27},
{"Tom", "aoi", 13},
{"Roberto", "kei", 54},
}
fmt.Println("sort前", people)
// peopleのデータがなかったらエラーを出す
if len(people) == 0 {
log.Fatal("データがありません。")
}
// ソートする
sort.Slice(people, func(i int, j int) bool {
return people[i].FirstName < people[j].FirstName
})
fmt.Println("sort後", people)
}
// sort前 [{Bob lob 27} {Tom aoi 13} {Roberto kei 54}]
// sort後 [{Bob lob 27} {Roberto kei 54} {Tom aoi 13}]
説明
上記の関数では、i
とj
を受け取りpeople[i].FirstName
とpeople[j].FirstName
を比較してi
の方が小さい場合にtrue
を返して小さい順に並び替えます。
Unicodeの概要
こちらのサイトを見れば、一覧で見ることができます。
文字に対して、コードポイントという目印をつけられ、サイトの一覧を見ると表の左上にいけば先に表示されるようになります。
例えば、上記の実装で記述した内容では、FirstNameを基準にsortしています。Bob
とTom
を比較した時に最初の文字のB
とT
で判定されます。Bは表からU+0042、TはU+0054になり、今回は小さい順になるので、Bob
の方が先になります。
参考記事