ホームページ  >  記事  >  バックエンド開発  >  Goで入れ子になったスライスフィールドを持つ構造体のスライスを並べ替えるにはどうすればよいですか?

Goで入れ子になったスライスフィールドを持つ構造体のスライスを並べ替えるにはどうすればよいですか?

Mary-Kate Olsen
Mary-Kate Olsenオリジナル
2024-10-27 06:18:29328ブラウズ

How to Sort a Slice of Structs with Nested Slice Fields in Go?

スライス フィールドによる並べ替え

Go では、さらにネストされたスライス フィールドを含む構造体のスライスを並べ替える必要があるシナリオに遭遇することがあります。以下の例を考えてみましょう。

<code class="go">type Parent struct {
    id       string
    children []Child
}

type Child struct {
    id string
}</code>

次の値を持つ親構造体のスライスがあるとします。

<code class="go">parents := make([]Parent, 0)

p1 := Parent {
    "3",
    []Child {
        {"2"},
        {"3"},
        {"1"},
    },
}

p2 := Parent {
    "1",
    []Child {
        {"8"},
        {"9"},
        {"7"},
    },
}

p3 := Parent {
    "2",
    []Child {
        {"5"},
        {"6"},
        {"4"},
    },
}             

parents = append(parents, p1, p2, p3)</code>

目標は、2 つの基準に基づいて親スライスを並べ替えることです。

  1. まず、Parent.id で並べ替えます。
  2. 各親内で、子のスライスを Child.id で並べ替えます。

解決策:

希望の並べ替えを実現するには、sort.Slice 関数を使用して、親スライスとネストされた子スライスを並べ替えます。コードは次のとおりです。

<code class="go">// sort each Parent in the parents slice by Id
sort.Slice(parents, func(i, j int) bool {return parents[i].id < parents[j].id})

// for each Parent, sort each Child in the children slice by Id
for _, parent := range parents {
    sort.Slice(parent.children, func(i, j int) bool {return parent.children[i].id < parent.children[j].id})
}</code>

このコードは、最初に親スライスを並べ替えて、親が ID フィールドに基づいて昇順に配置されるようにします。続いて、親ごとに、同じ方法で子のスライスを並べ替えます。

期待される結果:

<code class="go">[{1 [{7} {8} {9}]} {2 [{4} {5} {6}]} {3 [{1} {2} {3}]}]</code>

以上がGoで入れ子になったスライスフィールドを持つ構造体のスライスを並べ替えるにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。