0
0

Go言語でsortした時の並び順を初歩的に調査してみた

Posted at

疑問

データを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}]

説明

上記の関数では、ijを受け取りpeople[i].FirstNamepeople[j].FirstName を比較してiの方が小さい場合にtrueを返して小さい順に並び替えます。

Unicodeの概要

こちらのサイトを見れば、一覧で見ることができます。

文字に対して、コードポイントという目印をつけられ、サイトの一覧を見ると表の左上にいけば先に表示されるようになります。

例えば、上記の実装で記述した内容では、FirstNameを基準にsortしています。BobTom を比較した時に最初の文字のBTで判定されます。Bは表からU+0042、TはU+0054になり、今回は小さい順になるので、Bobの方が先になります。

参考記事

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0