从列表中删除对象

时间:2014-11-20 03:28:12

标签: java list iterator

假设我们有一个Pencil类,它有两个这样的属性:

public class Pencil {
    String color;
    int length;

    public Pencil(String c, int sh, int l) {
        this.color = c;
        this.length = l;
    }
    public String getColor() {
        return color;
    }
}
然后我们将4个铅笔的对象放入一个盒子中:

public class Box {

    ArrayList<Pencil> list;
    public Box() {
        list = new ArrayList<Pencil>();
        list.add(new Pencil("blue", 5, 10));
        list.add(new Pencil("black", 5, 10));
        list.add(new Pencil("brown", 5, 10));
        list.add(new Pencil("orange", 5, 10));
    }
}

然后我们想要根据color的值从列表中删除其中一个对象:

public class TestDrive {
    public static void main(String[] args) {
        Box b = new Box();
        ArrayList box = b.list;        
        Iterator it = box.iterator();
        while(it.hasNext()) {
            Pencil p = (Pencil) it.next();
            if (p.getColor() == "black") {
                box.remove(p);
            }
        }
    }
}

看起来很简单,但我得到了Exception in thread "main" java.util.ConcurrentModificationException。如果有人能说出我在这里缺少的东西,我会很感激

2 个答案:

答案 0 :(得分:3)

你有两个问题。

第一个问题 - 您获得ConcurrentModificationException的原因 - 是因为您使用列表删除元素,而不是迭代器

您必须使用it.remove()删除您当前所在的元素。

接下来,您要将字符串与==进行比较 - 这并不能保证完全正常工作。您应该使用.equals代替。

撤消您比较它们的顺序,这样您就不会有机会获得NullPointerException

这里是块的样子,重新访问。

public static void main(String[] args) {
    Box b = new Box();
    ArrayList<Pencil> box = b.list;
    for(Iterator<Pencil> it = box.iterator(); it.hasNext();) {
        Pencil p = it.next();
        if ("black".equals(p.getColor())) {
            it.remove();
        }
    }
}

答案 1 :(得分:2)

致电it.remove()而非box.remove(p)