【问题标题】:Removing an item from a list in Java从Java列表中删除一个项目
【发布时间】:2015-04-02 05:54:27
【问题描述】:

我已经搜索了这个网站(以及网络),但由于某种原因找不到有效的答案。要么我得到一个索引越界错误,要么我的代码的下一部分不会执行。我要做的就是使用迭代器从 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”类,但这里也是如此:

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--;
        }
    };
}

非常感谢任何帮助,谢谢大家!

克莱顿

【问题讨论】:

  • 数组不是列表。您不能对两个不同的容器执行相同的操作。
  • @AngeloAlvisi 你到底在说什么?
  • @ajb 标签。数组不是 List,Iterator 也不是 ListIterator,即使 Iterator 可以在 List 上使用。
  • @AngeloAlvisi 我明白了——我没有看过标签。无论如何,我已经几乎放弃了期望标签与问题有任何关系。
  • @AngeloAlvisi 你可能已经放弃了,但不知何故确切地知道我在说什么,并完美地回答了这个问题,正如预期的那样。所以谢谢,杰森。

标签: java arrays list iterator listiterator


【解决方案1】:

每次调用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--;
    }
}

【讨论】:

  • 非常感谢,@Jason。这正是我一直在寻找的。你更正的最下面的代码也是我教授的,他很快发现他的原始代码有一个错误,所以再次感谢您揭露这一点。
猜你喜欢
  • 1970-01-01
  • 2011-02-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-12-20
相关资源
最近更新 更多