删除ArrayList中的方法

时间:2018-05-25 08:07:24

标签: 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 个答案:

答案 0 :(得分:1)

你的方法根本没有删除。

使用:(不是java代码)

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

首先,每次在右侧循环移位(在索引之前开始一个单元格)。

[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] 

这是在索引上严重执行的addremove方法的混合。

要从数组中删除元素,您只需要在左侧索引后移动每个项目。我还通过返回删除的值来更改返回值以匹配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

答案 1 :(得分:-3)

您的代码不会从列表中删除任何项目。 如果要删除某些内容,请使用已提供的方法: list.remove(index)或list.remove(Object)