java - 从 Java 列表中删除项目

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

我的迭代器显然继承 self 的“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--;
        }
    };
}

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

克莱顿

最佳答案

每次调用 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 - 从 Java 列表中删除项目,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28292090/

相关文章:

java - Spring-Boot-Maven-Plugin,无法实例化接口(interface) org.springframework.context.ApplicationContextInitializer

JavaFX——人们怎么想?

PHP/MySql 改变数组格式

c# - 使用 for 循环 C# 初始化数组和变量名称

Excel:从值列创建一个列表(没有空格或空格)

java - Hibernate 映射列表 - 索引

java - EMMA 代码覆盖率报告使用的颜色图例

java - 未能获取信号量的线程会发生什么情况?

java - 在 Android Studio 中的 OnClick 类之间共享数组

android - 具有圆形内边缘的方形布局边框