ホームページ  >  記事  >  バックエンド開発  >  重複を作成せずに Go でスライス項目を移動するにはどうすればよいですか?

重複を作成せずに Go でスライス項目を移動するにはどうすればよいですか?

DDD
DDDオリジナル
2024-11-01 09:48:02666ブラウズ

How do you move a slice item in Go without creating duplicates?

Go 内でのスライス項目の移動: 正しいテクニックを理解する

Go でスライスを走査するには、要素の再配置が必要になることがよくあります。項目をある位置から別の位置に直接移動しようとすると、提供されたコード スニペットに示すように、予期しない結果が生じる可能性があります。

<code class="go">slice := []int{0,1,2,3,4,5,6,7,8,9}

indexToRemove := 1
indexWhereToInsert := 4

slice = append(slice[:indexToRemove], slice[indexToRemove+1:]...)
newSlice := append(slice[:indexWhereToInsert], 1)
slice = append(newSlice, slice[indexWhereToInsert:]...)</code>

このアプローチでは、indexToRemove の項目をindexWhereToInsert に移動することを目的としていますが、出力は次のようになります。移動されたアイテムの 2 つのコピー。エラーは、項目の削除および挿入方法にあります。別のアプローチを検討してみましょう:

項目操作にカスタム関数を利用する

スライスを手動で変更する代わりに、挿入と削除のための専用関数を作成できます:

<code class="go">func insertInt(array []int, value int, index int) []int {
    return append(array[:index], append([]int{value}, array[index:]...)...)
}

func removeInt(array []int, index int) []int {
    return append(array[:index], array[index+1:]...)
}</code>

アイテムを正確に移動

これらのヘルパー関数を使用すると、アイテムの移動が簡単になります:

<code class="go">func moveInt(array []int, srcIndex int, dstIndex int) []int {
    value := array[srcIndex]
    return insertInt(removeInt(array, srcIndex), value, dstIndex)
}</code>

サンプルの実装と出力

<code class="go">func main() {
    slice := []int{0,1,2,3,4,5,6,7,8,9}

    fmt.Println("Original slice:", slice)

    slice = insertInt(slice, 2, 5)
    fmt.Println("After insertion:", slice)

    slice = removeInt(slice, 5)
    fmt.Println("After removal:", slice)

    slice = moveInt(slice, 1, 4)
    fmt.Println("After moving:", slice)
}</code>

出力:

Original slice: [0 1 2 3 4 5 6 7 8 9]
After insertion: [0 1 2 3 4 2 5 6 7 8 9]
After removal: [0 1 2 3 4 5 6 7 8 9]
After moving: [0 2 1 3 4 5 6 7 8 9]

このアプローチでは、インデックス 1 の項目がインデックス 4 に正しくシフトされ、期待どおりの出力が得られます。

以上が重複を作成せずに Go でスライス項目を移動するにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

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