bugfix> java > 投稿
public void remove(Object o) {
    remove(size, o);
}
public void remove(int index, Object o) {
    for (int i=index; i<size-1; i++) 
        data[i] = data[i - 1];
    data[index] = o;
    size--;
}

インデックスまたはオブジェクトを使用して特定の要素を削除したいのですが、今では最後の要素のみを削除します。この問題を修正する方法を知ることができますか?

回答 2 件
  • メソッドはまったく削除されません。

    使用:(Javaコードではない)

    data = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]  
    data.remove(3, 99) // 3 is the index, not the value.
    
    

    最初に、ループは右にシフトします(インデックスの1つ前のセルから開始します)。

    [0, 1, 2, 2, 3, 4, 5, 6, 7, 8]
    
    

    最後の値を失う( size によって隠されている) 変数)、実際には data[size] にあります

    次に、 Object o を設定します  インデックスで。

    [0, 1, 2, 99, 3, 4, 5, 6, 7, 8]
    
    

    そして、サイズを減らして、別の値を失います。

    [0, 1, 2, 99, 3, 4, 5, 6, 7]
    
    

    結果はどこにあるべきか

    data = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]  
    data.remove(3); //the index, not the value but in this example, the value is the same as the index
    [0, 1, 2, 4, 5, 6, 7, 8, 9]
    
    

    add のミックスです  および remove  インデックスに不適切に実装されたメソッド。


    配列から要素を削除するには、左側のインデックスの後にすべてのアイテムをシフトするだけです。また、 List.remove に一致するように戻り値を変更します  返される値は削除されます。 ( implements List<T> ができる/すべきである  正しい Collection を取得する )

    private T remove(int index){
        //keep the value to return at the end        
        T t = data[index];
        //Shift from index to the end
        for(int i = index; i < size - 1; ++i){
            data[index] = data[index + 1];
        }
        //remove the reference for an eventual GC visibility (prevent memory leaks)
        data[size - 1] = null;
        size--;
        return t;
    }
    
    

    null を設定  最後のセルで、GCの参照を必ず解放してください。 そしてもちろん、サイズを減らします。

    これは安全ではありません。これにはいくつかの境界検証が必要です!これは、現時点ではArrayIndexOutOfBoundsExceptionをスローする可能性があります

  • コードはリストから項目を削除しません。 何かを削除する場合は、既に提供されているメソッドを使用します。 list.remove(index)またはlist.remove(Object)

あなたの答え