1. ホーム
  2. スクリプト・コラム
  3. ゴラン

Golang 効率的なソートデータの詳細

2022-01-07 17:27:34

1. はじめに

Golang Golang言語の標準ライブラリであるsortパッケージは、データを直接ソートする機能を提供します。 sort.Sort() 関数を使ってデータを並べ替えることができます。 sort.Sort() この関数の基本的な実装は高速ソートに基づいており、対象データの仕様に応じて異なるソートアルゴリズムが選択される。この記事では、データのソートにsortパッケージを使用することを説明します。

2. スライスアンドソート

Golang 言語標準ライブラリのソートパッケージである sort.Sort() 関数は、データの並べ替えに必要な interface 型の入力 sort.Interface という3つのメソッドを含んでいます。 Len() は3つのメソッドを含んでいます Less() Swap() . つまり、sort パッケージの Sort 関数を使ってデータをソートする必要がある場合、最初に参照するデータがこれら 3 つのメソッドを実装している必要がありますし、これら 3 つのメソッドを実装している任意の要素タイプのスライスは、Sort パッケージの Sort() 関数でデータをソートする。

ソートパッケージのコードです。

type Interface interface { 
 Len() int // The number of elements in the set 
 Less(i, j int) bool // describes the order of the elements 
 Swap(i, j int) // swap the elements with indexes i and j 
} 
 
func Sort(data Interface) 



ここで重要なのは sort.Sort() 関数はデータのソートが安定していることを保証するものではありません。もしデータのソートが安定していることを保証する必要があるなら、 sort.Stable() 関数を使うことができます。ここで "stable" とは、元のデータにおける a と b の値が等しく、ソートの前に a が b よりも前にあり、ソートの後にも a が b よりも前にあることを意味します。

読者が理解しやすいように、int型のスライスを例にして、以下のように紹介します。 sort.Sort() 関数では IntSlice []int という型を与え、その型に IntSlice インプリメント sort.Interface インターフェース型で定義された3つのメソッドを実行し、sort.Sort()関数でデータを並べ替えます。

コード例です。

package main 
 
import ( 
 "fmt" 
 "sort" 
) 
 
type IntSlice []int 
 
func (s IntSlice) Len() int { 
 return len(s) 
} 
 
func (s IntSlice) Less(i, j int) bool { 
 return s[i] > s[j] 
} 
 
func (s IntSlice) Swap(i, j int) { 
 s[i], s[j] = s[j], s[i] 
} 
 
func main () { 
 intSlice := IntSlice([]int{1, 3, 5, 7, 9}) 
 fmt.Println(intSlice) // before sorting 
 sort.Sort(intSlice) 
 fmt.Println(intSlice) // after sorting 
} 



出力構造。

[9 7 5 3 1]
[1 3 5 7 9]

これを読んで、賢い読者は次のように理解したことでしょう。 sort.Sort() Sort()を使うたびに、こんな面倒なことをしなければならないのか、という疑問も出てきます。いっそのこと、データをソートするためのトラバーサルを自分で書いたほうがいいかもしれない。

はい、もちろんそんな面倒なことはしなくていいんです。 sort パッケージはすでに共通関数をラップしてくれているので、それを使うだけでいいんです。ですから、上記のサンプルコードは sort.Ints() 関数を使ってデータを並べ替えることができます。

サンプルコードです。

func main () { 
 intSlice := IntSlice([]int{9, 7, 5, 3, 1}) 
 fmt.Println(intSlice) // before sorting 
 sort.Ints(intSlice) 
 fmt.Println(intSlice) // use sort.Ints() to sort the data 
} 



に加えて sort.Ints() sort.Float64s() を使用します。 sort.Strings() などです。

3. カスタムコレクションのソート

での Golang 言語プロジェクトの開発では、構造体を使うことが多い。構造体型のスライスをソートする必要がある場合、どのようにすればよいのでしょうか?

を使用することができます。 Part 01 を記述した方法で、これら3つのメソッドを実装し、さらに Sort() 関数はもちろんのこと sort パッケージは、構造体型のスライスをソートする関数もラップしています。 sort.Slice() ただし、ソートするデータの他に引数を与える必要があり、その場合は Less() 関数型の引数を指定します。

コード例です。

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("By name:", people) 
 
 sort.Slice(people, func(i, j int) bool { return people[i].Age < people[j].Age }) 
 fmt.Println("By age:", people) 



出力結果です。

名前別:[{アリス55} {ボブ75} {ゴーファー7} {ヴェラ24}]です。
年齢別では [{ゴーファ 7} {ヴェラ 24} {アリス 55} {ボブ 75}] です。

4 まとめ

この記事では Golang 言語標準ライブラリ sort ここで重要なのは、この記事で使用した型以外で sort.Interface の3つのメソッドをすべて呼び出すことができます。 sort.Sort() 関数を使ってデータを並べ替えることができます。

これはGolang効率的なソートデータの詳細についてのこの記事の終わりです、より関連するGolang効率的なソートデータの内容は、スクリプトハウスの以前の記事を検索してくださいまたは、次の関連記事を閲覧し続けるあなたは、将来的にもっとスクリプトハウスをサポートすることを願っています