【问题标题】:UnsupportedOperationException when using iterator.remove()使用 iterator.remove() 时出现 UnsupportedOperationException
【发布时间】:2015-01-23 14:42:19
【问题描述】:

我试图从List 中删除一些元素,但即使是最简单的示例,如this answerthis 中的示例,也无法正常工作。

public static void main(String[] args)
{
    List<String> list = Arrays.asList("1", "2", "3", "4");
    for (Iterator<String> iter = list.listIterator(); iter.hasNext();)
    {
        String a = iter.next();
        if (true)
        {
            iter.remove();
        }
    }
}

Exception in thread "main" java.lang.UnsupportedOperationException
    at java.util.AbstractList.remove(Unknown Source)
    at java.util.AbstractList$Itr.remove(Unknown Source)

使用普通的Iterator 而不是ListIterator 没有帮助。 我错过了什么?我正在使用 java 7。

【问题讨论】:

    标签: java iterator


    【解决方案1】:

    Arrays.asList() 返回一个列表,由原始数组支持。您对列表所做的更改也会反映在您传入的数组中。因为您无法在数组中添加或删除元素,所以也无法对以这种方式创建的列表执行此操作,这就是您的 remove 调用失败的原因。 如果您希望能够动态添加和删除元素,则需要对 ListArrayListLinkedList 等)进行不同的实现。

    【讨论】:

    • 像 Java 这样的静态安全 OO 语言的重点难道不是没有不支持超类方法的子类吗?
    • @Yamcha 是的...... java 只是不是一种设计良好的语言。如果您正在寻找替代品,我建议您使用 scala。
    • 好吧,我不会说 Java 不是一种设计良好的语言,但我认为你肯定会争辩说存在一些奇怪的妥协(原语),以及其他附加 -诸如泛型之类的东西,尽管经过了数月甚至数年的反复和设计,但仍存在一些缺点,例如此示例所示...
    • @michaelok 好吧,我想这是一个品味问题:) 如果您考虑在核心库接口上定义的方法抛出运行时异常以报告缺少“设计良好”的实现,那么 java 就是! :)
    • 刚刚意识到 List 是一个具有抽象删除方法的接口docs.oracle.com/en/java/javase/11/docs/api/java.base/java/util/…
    【解决方案2】:

    这只是 Arrays.asList() 的一个功能,之前已经询问过,请参阅this question

    您可以将其包装在一个新列表中

    List list = new ArrayList(Arrays.asList("1",...));
    

    【讨论】:

      【解决方案3】:

      使用要删除的元素创建一个新列表,然后调用removeAll 方法。

      List<Object> toRemove = new ArrayList<Object>();
      for(Object a: list){
          if(true){
              toRemove.add(a);
          }
      }
      list.removeAll(toRemove);
      

      【讨论】:

      • 如果投反对票,请至少说明原因,以便他们知道问题所在
      • 不是downvoter,而是removeAll()AbstractCollection中实现,并使用Iterator.remove()。所以,如果Iterator.remove() 不起作用,removeAll() 也不起作用。
      • @Ascalonian 列举所有错误的原因不适合评论:) 这一次,正如 FlorentBayle 解释的那样,它根本不起作用。此外,它不会(尝试)回答问题(为什么 OP 的代码不起作用)。它使用像 List&lt;Object&gt; 这样的东西,这是毫无意义和误导性的,也是不好的做法。如果它确实有效,那将是一个非常糟糕的 (N^2) 实现。它没有试图解释为什么作者认为需要以这种由内而外的方式来完成。等等。
      猜你喜欢
      • 1970-01-01
      • 2012-11-21
      • 1970-01-01
      • 1970-01-01
      • 2019-02-27
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多