`
tracySun
  • 浏览: 29093 次
  • 来自: ...
社区版块
存档分类
最新评论

用Iterator时注意对集合元素的删除

阅读更多

在用Iterator去取集合元素的过程中(如Map、List),禁止使用集合本身的remove方法删除元素,用Iterator的remove()方法代替
 否则会报异常java.util.ConcurrentModificationException。

java 代码
  1.         List list = tree.getChildren();   
  2.         if (list != null) {   
  3.             Map map=new HashMap();   
  4.             Iterator iterator = list.iterator();   
  5.             RoleTreeNode childNode;   
  6.             RoleTreeNode leafNode;   
  7.             while (iterator.hasNext()) {   
  8.                    
  9.                 childNode = (RoleTreeNode) iterator.next();   
  10.                 if (!childNode.isNodeChecked())   
  11.                     continue;   
  12.                 List list1 = childNode.getChildren();   
  13.                 if (list1 != null) {   
  14.                     Iterator iterator1 = list1.iterator();   
  15.                     while (iterator1.hasNext()) {   
  16.                         leafNode = (RoleTreeNode) iterator1.next();   
  17.                         if (leafNode.isNodeChecked()) {   
  18.                             addBranchVersion(childNode.getIdentifier(),   
  19.                                     branchId, leafNode.getDescription());   
  20.                             /*在用Iterator去取集合元素的过程中(如Map、List),禁止使用集合本身的remove方法删除元素,用Iterator的remove()方法代替  
  21.                              * 否则会报异常java.util.ConcurrentModificationException*/  
  22.                             if(childNode.getChildCount()!=1)   
  23.                             {   
  24.                                 iterator1.remove();   
  25. //                              childNode.getChildren().remove(leafNode);   
  26.                             }   
  27.                             else  
  28.                             {   
  29.                                 iterator.remove();   
  30. //                              tree.getChildren().remove(childNode);   
  31.                             }   
  32.                             List rightList=rightTree.getChildren();   
  33.                             boolean flag=false;   
  34.                             for(int i=0;i<rightTree.getChildCount();i++)   
  35.                             {   
  36.                                 RoleTreeNode rightNode=(RoleTreeNode)rightList.get(i);   
  37.                                 String rightNodeDes=rightNode.getDescription();   
  38.                                 if(rightNodeDes.equals(childNode.getDescription()))   
  39.                                 {   
  40.                                     /*向左树添加rightNode的child(有且只有一个)*/  
  41.                                     childNode.getChildren().add(rightNode.getChildren().get(0));   
  42.                                     /*重构rightNode,复制左树与右树同description的左树的二级结点的选中的儿子到右树*/  
  43.                                     rightNode.getChildren().remove(0);   
  44.                                        
  45.                                     rightNode.setDescription(childNode.getDescription());   
  46.                                     rightNode.setIdentifier(childNode.getIdentifier());   
  47.                                     rightModel.setNodeId(childNode.getIdentifier());   
  48.                                     leafNode.setNodeChecked(false);   
  49.                                     rightNode.getChildren().add(leafNode);   
  50.                                     flag=true;   
  51.                                     break;   
  52.                                 }   
  53.                                    
  54.                             }   
  55.                             if(!flag)   
  56.                             {   
  57.                                 RoleTreeNode newRightNode=new RoleTreeNode();   
  58.                                 newRightNode.setDescription(childNode.getDescription());   
  59.                                 newRightNode.setIdentifier(childNode.getIdentifier());   
  60.                                 newRightNode.setLeaf(false);   
  61.                                 newRightNode.setType(childNode.getType());   
  62.                                 newRightNode.setNodeChecked(false);   
  63.                                 leafNode.setNodeChecked(false);   
  64.                                 newRightNode.getChildren().add(leafNode);   
  65.                                 rightModel.setNodeId(childNode.getIdentifier());   
  66.                                 rightTree.getChildren().add(newRightNode);   
  67.                             }   
  68.                                
  69.                             break;   
  70.                         }   
  71.                     }   
  72.                 }   
  73.             }   
  74.             map.put("leftTree",tree);   
  75.             map.put("rightTree",rightTree);   
  76.             return map;   
  77.         }  
分享到:
评论
3 楼 tracySun 2008-01-03  
用迭代器去删除元素,比如一个list,本身它有remove方法,但在用迭代器遍历时,如果要删除元素,就要用Iterator提供的romove方法。
2 楼 tap2008 2007-12-29  
“用Iterator的remove()方法代替”,没看清楚,呵呵!
1 楼 tap2008 2007-12-29  
我以前做hibernate的时候,remove集合(List)的时候也抛出了这个异常,请问有什么解决办法吗?谢谢!

相关推荐

    使用Iterator接口遍历集合元素

    2. 当使用 Iterator 来迭代访问 Collection 集合元素时,Collection 集合里的元素不能被改变,只有通过 Iterator 的 remove 方法来删除上一次 next 方法返回的集合元素才可以。否则将会引发 java.util....

    Java集合使用 Iterator 删除元素

    Java集合使用Iterator删除元素 ...本文对Java集合使用Iterator删除元素进行了详细的介绍,通过示例代码展示了如何使用Iterator删除元素,并解释了Iterator的工作机制和使用注意事项。希望对大家的学习和工作有所帮助。

    Java如何使用Iterator迭代器删除集合重复选项

    Java 中使用 Iterator 迭代器删除集合重复选项是非常重要的知识点,以下是对该知识点的详细解释。 Iterator 迭代器的介绍 Iterator 迭代器是 Java 中的一种设计模式,用于遍历集合中的元素。它提供了一种方式来...

    hashMap利用iterator迭代器迭代元素方法

    当我们需要遍历`HashMap`中的所有元素时,通常会使用`Iterator`接口,它是Java集合框架的一部分,提供了对集合的迭代访问。 `Iterator`接口定义了三个基本方法:`hasNext()`、`next()`和`remove()`。`hasNext()`...

    Iterator接口

    Iterator接口和ListIterator接口的使用可以带来很多便利,例如,使用Iterator接口可以遍历集合中的元素,而不管集合的具体实现类型,同时也可以使用ListIterator接口来控制迭代器的行为,例如,添加或删除元素。...

    JAVA中的Iterator的用法

    它定义了一些基本的方法,包括添加元素、删除元素以及获取`Iterator`等。`Iterator`接口和`Collection`接口之间的关系十分紧密。 ##### 1. `Collection`的主要方法 - **`boolean add(Object c)`**:向集合中添加一...

    图解设计Iterator 源代码

    在Java编程语言中,`Iterator`接口是集合框架的核心部分,它允许我们遍历集合中的元素,而无需暴露集合的内部结构。这个设计模式被称为迭代器模式,它为访问聚合对象(如数组、集合等)提供了一种统一的接口。在本...

    Iterator迭代器讲解

    1. **避免暴露内部结构**:通过使用`Iterator`,开发者可以顺序访问集合中的元素,而无需了解集合的具体实现细节。这有助于保护集合内部的数据结构,使其更加安全可靠。 2. **多线程友好**:`Iterator`允许同一个...

    一个使用iterator和json技术的实例

    `Iterator`接口是`Iterable`接口的一个方法`iterator()`返回的,它提供了访问集合元素的机制,包括遍历元素、删除元素等功能。`Iterator`有三个主要的方法:`hasNext()`用于检查是否还有更多元素,`next()`用于获取...

    使用Iterator模式将对象转成String.docx

    在使用Iterator模式时,需要注意以下几点: 1. **迭代器的获取**:通常,聚合对象会提供一个方法来获取迭代器实例。 2. **遍历操作**:迭代器提供了`hasNext()`方法来检查是否还有更多元素,以及`next()`方法来获取...

    Iterator详解

    为了避免这种情况,可以使用`Collections.synchronizedList()`或`CopyOnWriteArrayList`等线程安全的集合类,或者在迭代时使用`Iterator`的`remove()`方法而不是集合的`remove()`方法。 8. **迭代器应用**: 迭代...

    模拟java ArrayList Iterator

    总的来说,这个资源提供了学习和实践Iterator设计模式的机会,加深了对Java集合框架的理解。通过模拟ArrayList的Iterator实现,我们可以更深入地掌握如何在实际编程中利用这一强大的工具。同时,这也为我们设计自己...

    在list集合中输入元素,去除重复的元素并输出

    需要注意的是,这里使用`iterator.remove()`而不是`list.remove()`来删除元素,这可以避免并发修改异常。 ### 三、使用HashSet特性去除重复元素 这种方法利用了HashSet的特性,即HashSet不允许有重复的元素。将...

    java Iterator迭代器的使用

    Java中的`Iterator`接口是Java集合框架的重要组成部分,它提供了遍历集合元素的机制。`Iterator`被设计用来遍历各种类型的集合,如ArrayList、LinkedList、Set等。在这个主题中,我们将深入理解`Iterator`的工作原理...

    for,foreach,iterator的用法和区别

    iterator 是最强大的,他可以随时修改或者删除集合内部的元素,并且是在不需要知道元素和集合的类型的情况下进行的。 当我们需要遍历不同的集合时,我们只需要传递集合的 iterator(如 arr.iterator()),这就实现...

    Iterator遍历过程中list删除导致异常

    当你想在迭代过程中删除元素时,应该使用`Iterator`的`remove()`方法,而不是直接调用集合的`remove()`方法。这样,`Iterator`会正确处理集合的内部状态,避免异常: ```java List&lt;String&gt; list = new ArrayList...

    java集合使用大全

    迭代器其实就是从集合中取元素的方式:每个集合都有取元素的方法,但是取元素不足以用一个方法来描述,所以就将取元素封装成一个 Iterator 接口类。每个集合都有迭代器。迭代器其实就是集合的内部类(该类实现 ...

    Collection、Map、List、Set、Iterator

    - **定义**:`Iterator` 提供了一个遍历集合元素的方式,它是 `Collection` 接口中 `iterator()` 方法的返回类型。 - **基本方法**: - `hasNext()`:判断是否有下一个元素。 - `next()`:返回集合中的下一个元素...

    Map、Set、Iterator迭代详解

    ### Map接口详解 #### 1. Map接口概览 ...通过以上对`Map`、`Set`、`Iterator`以及Java集合框架的详细介绍,我们不仅可以了解到这些接口和类的基本概念和使用方法,还能深入理解它们在实际编程中的应用价值。

    11-Iterator.rar

    迭代器设计模式是一种在软件工程中广泛使用的模式,它的主要目的是提供一种方法来顺序访问聚合对象的元素,而无需暴露其底层表示。这个模式允许我们遍历集合中的所有元素,而不必了解集合的具体实现。在Java、C#等...

Global site tag (gtag.js) - Google Analytics