次のコラム golang チュートリアル では、golang の並べ替えと使い方について紹介します。困っている友人の役に立てば幸いです。
Golang 標準ライブラリは、整数などの一般的に使用される多くの並べ替えメソッドを実装しています。シーケンスの並べ替え: sort.Ints()
,
では、カスタム データ構造を並べ替える場合はどうすればよいでしょうか?
たとえば、ユーザーのリストの場合、ポイント順に並べ替えます:
最初にデータ構造を定義します。問題を明確に説明するために、フィールドは 2 つだけ指定します。
type User struct { Name string Score int}type Users []User
golang でソートをカスタマイズしたい場合は、独自の構造に 3 つのメソッドを実装する必要があります:
// 摘自: $GOROOT/src/sort/sort.gotype Interface interface { // Len is the number of elements in the collection. Len() int // Less reports whether the element with // index i should sort before the element with index j. Less(i, j int) bool // Swap swaps the elements with indexes i and j. Swap(i, j int)}
このデザインは素晴らしいですね。私たちのソートについて考えてみましょう。長さ、比率のサイズ、要素の交換など、すべてにシーケンスが必要です。
golang を使用して上記の Users、つまりユーザーリストを並べ替えるにはどうすればよいですか?
まず、記述どおりにこれら 3 つのメソッドを実装します:
func (us Users) Len() int { return len(us)}func (us Users) Less(i, j int) bool { return us[i].Score < us[j].Score}func (us Users) Swap(i, j int) { us[i], us[j] = us[j], us[i]}
次に、並べ替えることができます:
func main() { var us Users const N = 6 for i := 0; i < N; i++ { us = append(us, User{ Name: "user" + strconv.Itoa(i), Score: rand.Intn(N * N), }) } fmt.Printf("%v\n", us) sort.Sort(us) fmt.Printf("%v\n", us)}
可能な出力は次のとおりです:
[{ user0 5} {user1 15} {user2 11} {user3 11} {user4 13} {user5 6}]
[{user0 5} {user5 6} {user2 11} {user3 11} {user4 13} {user1 15}]
ご覧のとおり、スコアは小さいものから大きいものまで並んでいます。
ただし、通常、ポイントは大きいものから小さいものへと並べ替えられます。 sort.Sort(us)
を sort.Sort(sort .Reverse(us))# に変更するだけです。 ## します。
独自にソートを実装することもできます。たとえば、上記の場合、自分でソートすることができます (小規模から大規模まで):
func myqsort(us []User, lo, hi int) { if lo < hi { pivot := partition(us, lo, hi) myqsort(us, lo, pivot-1) myqsort(us, pivot+1, hi) }}func partition(us []User, lo, hi int) int { tmp := us[lo] for lo < hi { for lo < hi && us[hi].Score >= tmp.Score { hi-- } us[lo] = us[hi] for lo < hi && us[lo].Score <= tmp.Score { lo++ } us[hi] = us[lo] } us[lo] = tmp return hi}単純なクイック ソート。呼び出し時に
myqsort(us) だけが必要です。
以上がgolangでのソートの使用についての詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。