【问题标题】:Java delete arraylist iteratorJava删除arraylist迭代器
【发布时间】:2012-11-30 15:00:52
【问题描述】:

我的类“炸弹”的 Java 中有一个 ArrayList。

这个类有一个方法'isExploded',如果炸弹已经爆炸,这个方法返回true,否则返回false。

现在我正在尝试遍历这个arraylist,调用这个方法isExploded,如果它返回true,则从列表中删除元素。

我知道如何迭代:

    for (Iterator i = bombGrid.listIterator(); i.hasNext();) {
    if () {         
        i.remove();
}

但我不知道如何通过迭代器访问 Bomb 类本身的 isExploded 方法。有谁知道这个问题的答案吗?

此致,

卢克索

【问题讨论】:

    标签: java arraylist iterator


    【解决方案1】:

    您需要使用next 获取炸弹:

    for (Iterator i = bombGrid.listIterator(); i.hasNext();) {
       Bomb bomb = (Bomb) i.next(); 
       if (bomb.isExploded()) i.remove();
    }
    

    或者,如果您可以从您的 bombGrid 中获得 Iterator<Bomb>(是 ArrayList<Bomb> 吗?):

    Iterator<Bomb> i = bombGrid.listIterator();
    while (i.hasNext()) {
       Bomb bomb = i.next(); 
       if (bomb.isExploded()) i.remove();
    }
    

    这假设您的迭代器支持remove,例如ArrayList 给出的情况就是这种情况。

    【讨论】:

      【解决方案2】:

      如果您使用 Java 5,请使用泛型:

      List<Bomb> bombGrid = ...;
      for (Iterator<Bomb> i = bombGrid.iterator(); i.hasNext();) {
        if (i.next().isExploded()) {         
          i.remove();
        }
      }
      

      【讨论】:

        【解决方案3】:

        不,您不能在迭代时删除 ArrayList 的迭代器内部。这是 Javadoc 摘录:

        此类的 iterator 和 listIterator 方法返回的迭代器是快速失败的:如果在创建迭代器后的任何时候对列表进行结构修改,除了通过迭代器自己的 remove 或 add 方法之外的任何方式,迭代器将抛出并发修改异常。因此,面对并发修改,迭代器快速而干净地失败,而不是在未来不确定的时间冒任意的、非确定性的行为。

        http://docs.oracle.com/javase/6/docs/api/java/util/ArrayList.html

        【讨论】:

        • 如果列表被修改使用迭代器,没问题。
        • the class Itr的实现:它处理了移除当前元素的情况。
        • 对不起,但即使它有效,我认为这不是一个好习惯,正如 javadoc 中所述:请注意,一般来说,不能保证迭代器的快速失败行为,在存在不同步的并发修改的情况下不可能做出任何硬保证。快速失败的迭代器会尽最大努力抛出 ConcurrentModificationException。因此,编写一个依赖于这个异常的正确性的程序是错误的:迭代器的快速失败行为应该只用于检测错误。而且我还看到了潜在的内存泄漏
        • 没有。显然没有。 Java 设计者在这里解决了一个重要问题。仅仅因为你想使用一个接口就失去了在迭代时删除的能力,从而失去了性能并使你的代码变得更加复杂,听起来,对不起,完全疯了......
        • @user1898956:在不太可能的情况下,有人使用不支持删除的列表,那么您对该方法的单元测试应该会捕获它。继续使用接口,并编写单元测试来验证代码是否正常工作,您将拥有干净、合乎逻辑且高效的代码。
        猜你喜欢
        • 1970-01-01
        • 2014-07-12
        • 1970-01-01
        • 2020-03-18
        • 2011-12-31
        • 2015-09-01
        • 2020-07-09
        • 2020-06-22
        • 2014-01-14
        相关资源
        最近更新 更多