2

我想知道从链接哈希集中删除元素的不同方法。我尝试了以下代码

LinkedHashSet<String> lhs = new LinkedHashSet<String>();
for(int i=0;i<10;i++)
  lhs.add(String.valueOf(i));
Iterator<String>  it=lhs.iterator();
System.out.println("removed?=="+lhs.remove("1"));
while(it.hasNext()) 
{
    System.out.println("lhs"+it.next());
}

我得到以下输出

removed?==true
Exception in thread "main" java.util.ConcurrentModificationException
at java.util.LinkedHashMap$LinkedHashIterator.nextEntry(Unknown Source)
at java.util.LinkedHashMap$KeyIterator.next(Unknown Source)
at preac.chapter1.Start.main(Start.java:321)

我想念什么?提前致谢。

PS我也尝试过 iterator.remove() 方法但得到了非法状态异常

编辑

我才知道我必须使用迭代器删除方法。那么 Link Hash Set 删除方法有什么用呢?在什么情况下我们应该使用这种方法?

4

2 回答 2

7

尝试使用Iterator.remove如下方式删除元素,

LinkedHashSet<String> lhs = new LinkedHashSet<String>();
for (int i = 0; i < 10; i++) {
   lhs.add(String.valueOf(i));
}  

Iterator<String>  it=lhs.iterator();
  //  System.out.println("removed?=="+lhs.remove("1"));
 while(it.hasNext()) {
   String value=it.next();
   if("1".equals(value)){
      it.remove();
   }
   else{
      System.out.println("lhs  "+value);// Print the other value except 1
    }
 }
System.out.println(lhs);// After remove see the result here.
于 2013-11-22T12:14:40.140 回答
2

您收到异常是因为迭代器意识到您remove在创建迭代器后调用了(使用内部修改计数器)。

让我们假设修改计数器加 1。创建迭代器时,它看到修改计数器为 10。但是,当第一次访问迭代器时,修改计数器为 11,因为调用了add,因此出现异常。removeremove

切换语句,应该没问题:

...
System.out.println("removed?=="+lhs.remove("1"));
Iterator<String>  it=lhs.iterator();
...
于 2013-11-22T12:19:23.257 回答