format_list_bulleted
【Golang】Golangのsortパッケージの基本的な使い方について解説
最終更新日時:2020-05-16 02:36:25



配列の中身を数値順に並び替えたいときありますよね、そのような場合に自分でソートを行う関数を定義して実装することもできますが、Golangではsortパッケージというものが用意されており、適切なソートアルゴリズムを深く考えなくてもソートを実装することができます。今回はsortパッケージの基本的な使い方について解説します。

sortパッケージの基本的な使い方

sortパッケージの使い方には用途に応じていろいろな使い方があります。今回はその中で最も単純なsort.Sortメソッドを用いたソートの実行方法について紹介します。使い方の手順は以下のようになっています。

  1. sort.Interfaceを満たすsliceを作成する
    1. Lenメソッドを指定する
    2. Lessメソッドを指定する
    3. Swapメソッドを指定する
  2. sort.Sortメソッドの引数にsort.Interfaceを満たす構造体を渡して実行する

sort.Interface型を満たすデータに対してsort.Sortメソッドを使用できるため、このデータをあらかじめ用意した後、sort.Sortメソッドを実行することでソートをすることができます。

Golangのsortを実際に使ってみる

実際に先ほどの手順に則ってsort.Sortを用いたソートを行ってみましょう。今回のソートに使用したコードはcode-databaseのgithubリポジトリにもありますので手元でコードを確認したい方は参考にしてみてください。今回は複数人の構造体を要素にもつsliceをそれぞれの要素の年齢を昇順にソートしてみましょう。

ソートするsliceを用意する

まずはソートをかけるsliceを用意しましょう。

タイトル:main.go

type Person struct {
	Name string
	Age  int
}

今回はこのようなPersonを要素にもつsliceを使用します。

タイトル:main.go

func main() {
	people := ByAge{
		{"Micael", 25},
		{"Nancy", 25},
		{"Jon", 27},
		{"Rachel", 21},
	}
	log.Print(people)
}

main関数内で4人分のデータを作成しておきます。念の為適切にデータができているかどうかlog.Printで確認しておきましょう。

タイトル:ターミナル

$ go run main.go

出力画面

しっかり作られているのが確認できます。今回はこのデータを年齢順にソートしたいと思います。

Lenメソッドを指定する

続いてsort.Interface型に必要なLenメソッドを定義しましょう。

タイトル:main.go

type ByAge []Person

func (arr ByAge) Len() int {
	return len(arr)
}

sort.Interface型を満たすためのslice(ByAge)を定義します。そしてLenメソッドを指定します。Lenメソッドではsliceの長さを返す処理を定義します。これでLenメソッドの指定は完了です。

Lessメソッドを指定する

Lenメソッドと同様にLessメソッドで隣り合うに要素でどのような条件を満たした場合にSwapメソッドを実行するのかについて定義します。

タイトル:main.go

func (arr ByAge) Less(i, j int) bool {
	return arr[i].Age < arr[j].Age
}

Lessメソッドは戻り値に真偽値を指定し、falseを返した場合Swapメソッドが実行されます。今回は隣り合う要素(n, n+1番目)のAgeフィールドについてn番目の要素のAgeよりもn+1番目の要素のAgeが小さい場合にSwapメソッドを実行したいのでarr[i].Age < arr[j].Ageの条件を指定しています。

Swapメソッドを指定する

最後にSwapメソッドを指定しましょう。これは隣り合う二要素に対してソートで入れ替えを行う際にどのような入れ替えを行うのかという条件について記述します。

タイトル:main.go

func (arr ByAge) Swap(i, j int) {
	arr[i], arr[j] = arr[j], arr[i]
}

今回は隣り合うものを入れ替えれば良いので上のようになります。

sort.Sortメソッドの引数にsort.Interfaceを満たす構造体を渡して実行する

sort.Interfaceを用意できたので作成したByAgeをsort.Sortメソッドの引数に入れて実行します。

タイトル:main.go

func main() {
	people := ByAge{
		{"Micael", 25},
		{"Nancy", 25},
		{"Jon", 27},
		{"Rachel", 21},
	}
	log.Print(people)
	sort.Sort(people) //追記
	log.Print(people) //追記
}

最後に正しく動作するか実行して確認してみましょう。

タイトル:ターミナル

$ go run main.go

出力画面

年齢順でソートされているのが確認できました!

この記事のまとめ

本記事ではGolangでsortパッケージの中でsort.Sortの基本的な使い方について解説しました。最後に記事の要点についてまとめておきます。

  • sortパッケージではsliceのソートをよしなに行ってくれる
  • sort.Sortメソッドを用いたソートではsort.Interfaceを満たすsliceを用意する必要がある
  • sort.Interface型を満たすsliceをsort.Sortメソッドの引数に入れることでソートが実行できる

皆さんもGolangのsortパッケージを使ってみましょう。Code Databaseでも順次他のsortに関する記事を配信する予定です!