いろいろ備忘録日記

主に .NET とか Go とか Flutter とか Python絡みのメモを公開しています。

Goメモ-407 (cmp.Or, cmp.Compareを用いて複合キーのソート処理を実装)

関連記事

GitHub - devlights/blog-summary: ブログ「いろいろ備忘録日記」のまとめ

概要

以下、自分用のメモです。忘れないうちにメモメモ。。

Go 1.22 で、cmp.Or という関数が追加されていたので、ついでにそれを利用して複合キーでのソート処理が楽に書けるサンプルをメモ書き。

サンプル

package cmpop

import (
    "cmp"
    "slices"

    "github.com/devlights/gomy/output"
)

// CompositeSortKeys は、cmp.Or, cmp.Compareを用いて複合キーのソート処理を実装するサンプルです。
func CompositeSortKeys() error {
    type Person struct {
        Name string
        Age  uint8
    }

    var (
        people = []Person{
            {"Aikawa", 21},
            {"Tanaka", 22},
            {"Kato", 33},
            {"Suzuki", 44},
            {"Tanaka", 44},
            {"Aikawa", 66},
        }
    )

    output.Stdoutl("[before]", people)

    // 名前の昇順が第1キー、年齢の降順が第2キーとする
    slices.SortFunc(people, func(x, y Person) int {
        return cmp.Or(
            cmp.Compare(x.Name, y.Name),
            -cmp.Compare(x.Age, y.Age),
        )
    })

    output.Stdoutl("[after ]", people)

    return nil
}

try-golang/examples/basic/cmpop/composite_sort_key.go at main · devlights/try-golang · GitHub

実行すると以下のようになります。

$ task
task: Task "build" is up to date
task: [run] ./try-golang -onetime

ENTER EXAMPLE NAME: cmpop_composite_sort_key

[Name] "cmpop_composite_sort_keys"
[before]             [{Aikawa 21} {Tanaka 22} {Kato 33} {Suzuki 44} {Tanaka 44} {Aikawa 66}]
[after ]             [{Aikawa 66} {Aikawa 21} {Kato 33} {Suzuki 44} {Tanaka 44} {Tanaka 22}]


[Elapsed] 62.25µs

参考情報

https://pkg.go.dev/cmp#example-Or

https://pkg.go.dev/cmp#example-Or-Sort

Goのおすすめ書籍


過去の記事については、以下のページからご参照下さい。

サンプルコードは、以下の場所で公開しています。