从 Java 中的列表中删除项目
Removing an item from a list in Java
我已经搜索过这个网站(以及网络),但出于某种原因找不到有效的答案。要么我得到一个索引越界错误,要么我的代码的下一部分不会执行。我想要做的就是使用迭代器从 Java 中的列表中删除一个项目。这是我的代码:
public boolean remove(T item) {
while (bag.iterator().hasNext()) {
T i = bag.iterator().next();
if (i.equals(item)) {
bag.iterator().remove();
return true;
}
}
return false;
}
我的迭代器显然继承自我的 "Bag" class,但这里也是:
public Iterator<T> iterator() {
return new Iterator<T>() {
private int current = 0;
public boolean hasNext() {
return current < size;
}
public T next() {
return data[current++];
}
public void remove() {
for (int i=current-1; i<size-1; i++)
data[i] = data[i+1];
size--;
}
};
}
非常感谢任何帮助,谢谢大家!!
克莱顿
每次调用 bag.iterator()
,都会得到一个新的 Iterator
对象,与之前的对象不同。您应该获取一次迭代器,然后在循环中使用它:
public boolean remove(T item) {
Iterator<T> iter = bag.iterator();
while (iter.hasNext()) {
T i = iter.next();
if (i.equals(item)) {
iter.remove();
return true;
}
}
return false;
}
您的代码还有另一个问题:如果您在调用 next()
之前在迭代器上调用 remove()
,您的代码将尝试访问 data[-1]
。您可能想在其周围放置一些保护代码,例如:
public void remove() {
if(current > 0) {
for (int i=current-1; i<size-1; i++)
data[i] = data[i+1];
size--;
}
}
我已经搜索过这个网站(以及网络),但出于某种原因找不到有效的答案。要么我得到一个索引越界错误,要么我的代码的下一部分不会执行。我想要做的就是使用迭代器从 Java 中的列表中删除一个项目。这是我的代码:
public boolean remove(T item) {
while (bag.iterator().hasNext()) {
T i = bag.iterator().next();
if (i.equals(item)) {
bag.iterator().remove();
return true;
}
}
return false;
}
我的迭代器显然继承自我的 "Bag" class,但这里也是:
public Iterator<T> iterator() {
return new Iterator<T>() {
private int current = 0;
public boolean hasNext() {
return current < size;
}
public T next() {
return data[current++];
}
public void remove() {
for (int i=current-1; i<size-1; i++)
data[i] = data[i+1];
size--;
}
};
}
非常感谢任何帮助,谢谢大家!!
克莱顿
每次调用 bag.iterator()
,都会得到一个新的 Iterator
对象,与之前的对象不同。您应该获取一次迭代器,然后在循环中使用它:
public boolean remove(T item) {
Iterator<T> iter = bag.iterator();
while (iter.hasNext()) {
T i = iter.next();
if (i.equals(item)) {
iter.remove();
return true;
}
}
return false;
}
您的代码还有另一个问题:如果您在调用 next()
之前在迭代器上调用 remove()
,您的代码将尝试访问 data[-1]
。您可能想在其周围放置一些保护代码,例如:
public void remove() {
if(current > 0) {
for (int i=current-1; i<size-1; i++)
data[i] = data[i+1];
size--;
}
}