Golang のスライスから要素を削除する方法 質問する

Golang のスライスから要素を削除する方法 質問する
fmt.Println("Enter position to delete::")
fmt.Scanln(&pos)

new_arr := make([]int, (len(arr) - 1))
k := 0
for i := 0; i < (len(arr) - 1); {
    if i != pos {
        new_arr[i] = arr[k]
        k++
        i++
    } else {
        k++
    }
}

for i := 0; i < (len(arr) - 1); i++ {
    fmt.Println(new_arr[i])
}

このコマンドを使用してスライスから要素を削除していますが、機能しません。ご提案をお願いします。

ベストアンサー1

順序は重要

配列の順序を維持したい場合は、削除インデックスの右側にあるすべての要素を 1 つ左にシフトする必要があります。これは、Golang では簡単に実行できます。

func remove(slice []int, s int) []int {
    return append(slice[:s], slice[s+1:]...)
}

ただし、すべての要素を移動することになり、コストがかかる可能性があるため、これは非効率的です。

順序は重要ではない

順序を気にしない場合は、削除する要素をスライスの末尾の要素に置き換えてから、最初の n-1 個の要素を返す方がはるかに高速です。

func remove(s []int, i int) []int {
    s[i] = s[len(s)-1]
    return s[:len(s)-1]
}

再スライス方式では、1,000,000 要素の配列を空にするのに 224 秒かかりますが、この方法では 0.06 ナノ秒しかかかりません。

この回答では境界チェックは実行されません。入力として有効なインデックスが必要です。つまり、負の値または初期値以上のインデックスはlen(s)Go をパニックに陥れることになります。

スライスと配列は 0 からインデックス付けされるため、配列の n 番目の要素を削除するには、入力n-1を指定することになります。最初の要素を削除するには、remove(s, 0)を呼び出し、2 番目の要素を削除するには、remove(s, 1)を呼び出します。以下同様に続きます。

おすすめ記事