0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

Goのsortパッケージでよく使う関数

Last updated at Posted at 2021-10-10

はじめに

Go標準のsortパッケージでは、スライスの並び替えなどをサポートしています。
本記事では、sortパッケージで一般的に利用される関数を紹介していきます。

Ints

int型のスライスを昇順で並び替えます。

go
package main

import (
	"fmt"
	"sort"
)

func main() {
	s := []int{5, 2, 3, 1, 4}
	sort.Ints(s)
	fmt.Println(s) //=> [1 2 3 4 5]
}

一般的なソート(バブルソート)と比較してみます。

go
package main

import "fmt"

func main() {
	s := []int{5, 2, 3, 1, 4}
	for i := 0; i < len(s)-1; i++ {
		for j := 0; j < len(s)-1-i; j++ {
			if s[j] > s[j+1] {
				s[j], s[j+1] = s[j+1], s[j]
			}
		}
	}
	fmt.Println(s) //=> [1 2 3 4 5]
}

Intsを使うだけでも、かなりのコード量を削減できますね。

Strings

string型のスライスを昇順で並び替えます。

go
package main

import (
	"fmt"
	"sort"
)

func main() {
	s := []string{"A", "C", "ab", "aa", "B"}
	sort.Strings(s)
	fmt.Println(s) //=> [A B C aa ab]
}

Slice

第2引数で渡した関数の処理を条件として、スライスを並び替えます。
若干ややこしいので、コードも交えて説明します。

go
package main

import (
	"fmt"
	"sort"
)

func main() {
	people := []struct {
		Name string
		Age  int
	}{
		{"Gopher", 7},
		{"Alice", 55},
		{"Vera", 24},
		{"Bob", 75},
	}
	sort.Slice(people, func(i, j int) bool { return people[i].Name < people[j].Name })
	fmt.Println(people) //=> [{Alice 55} {Bob 75} {Gopher 7} {Vera 24}]
}

第2引数で渡した関数内で、for文が2重で実行されていると考えてください。
people[i].Namepeople[j].Nameを比較し、小さい要素を前に持ってくるイメージです。
Ageで並び替えたい場合は、Nameの箇所をAgeに変更してください。

まとめ

アウトプット感覚で書きましたが、ご満足いただけたら幸いです。
Goを触り初めて1週間のド素人ですので、間違いなどがありましたら指摘していただけると助かります。

参考

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

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?