Golang 効率的なソートデータの詳細
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効率的なソートデータの内容は、スクリプトハウスの以前の記事を検索してくださいまたは、次の関連記事を閲覧し続けるあなたは、将来的にもっとスクリプトハウスをサポートすることを願っています
関連
-
Go言語の基本 go buildコマンドの使い方と例 詳細
-
Go言語の基本的なアプリケーションと一般的なコマンドの紹介
-
golangはファイルをダウンロードするためにマルチプロセッシングを実装しています(ブレークポイント転送をサポート)。
-
Golangのループステートメントとループ制御ステートメントの説明
-
Golang開発ライブラリ集と役割説明
-
Go言語 初心者のための7つのチュートリアル VI ネットワーク・プログラミング
-
Goはsync.Mapを使って、mapの同時操作問題を解決している
-
golangにおける効率的なコーディングの詳細
-
Golangのリフレクションを使った構造体のエレガントなソート機能
-
Goのアドレッサブルとノンアドレッサブルを1つの記事で理解する
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン