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--;
}
我想使用索引或对象删除某些元素,但现在它只删除最后一个元素。我能知道如何解决这个问题吗?
答案 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]
这是在索引上严重执行的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
答案 1 :(得分:-3)
您的代码不会从列表中删除任何项目。 如果要删除某些内容,请使用已提供的方法: list.remove(index)或list.remove(Object)