从Java中的列表中删除项目

时间:2015-02-03 05:40:08

标签: java arrays list iterator listiterator

我已经搜索过这个网站(以及网页),但由于某些原因找不到有效的答案。要么我得到索引超出界限错误,要么我的代码的下一部分不会执行。我想要做的就是使用迭代器从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--;
        }
    };
}

非常感谢任何帮助,谢谢你们!

克莱顿

1 个答案:

答案 0 :(得分:3)

每次拨打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;
}

您的代码还有另一个问题:如果您在致电remove()之前在迭代器上致电next(),您的代码将尝试访问data[-1]。您可能希望在其周围添加一些保护代码,例如:

public void remove() {
    if(current > 0) {
        for (int i=current-1; i<size-1; i++)
            data[i] = data[i+1];
        size--;
    }
}