在TreeSet上使用迭代器

aps*_*aps 10 java collections iterator treeset concurrentmodification

情况:我有一个自定义对象TreeSet,我也使用了自定义比较器.我已经创建了一个在这个TreeSet上使用的迭代器.

TreeSet<Custom> ts=new TreeSet<Custom>();
Iterator<Custom> itr=ts.iterator();
while(itr.hasNext()){
    Custom c=itr.next();
    //Code to add a new element to the TreeSet ts
}
Run Code Online (Sandbox Code Playgroud)

问题:我想知道如果我在while循环中向TreeSet添加一个新元素,那么新元素会立即被排序.换句话说,如果我在while循环中添加一个新元素并且它小于我当前在c中保存的元素,那么在下一次迭代中我将获得与上一次迭代中相同的元素吗?(因为在排序之后,新添加的元素将占据当前元素之前的某个位置.

Mic*_*vis 23

如果在迭代期间添加元素,则下一个迭代器调用可能会抛出一个ConcurrentModificationException.请参阅TreeSet文档中的故障快速行为.

要迭代和添加元素,您可以先复制到另一个集合:

TreeSet<Custom> ts = ...
TreeSet<Custom> tsWithExtra = new TreeSet(ts);

for (Custom c : ts) {
  // possibly add to tsWithExtra
}

// continue, using tsWithExtra
Run Code Online (Sandbox Code Playgroud)

ts科林建议,或者在迭代后创建一个单独的集合进行合并.

  • 也可以将元素排队到另一个集合中,然后在完成迭代后将它们全部添加,而不是在前面复制. (3认同)

anu*_*ava 6

如果在while循环中向TreeSet中添加元素,则会得到java.util.ConcurrentModificationException.

Set<String> ts=new TreeSet<String>();
ts.addAll(Arrays.asList(new String[]{"abb", "abd", "abg"}));
Iterator<String> itr=ts.iterator();
while(itr.hasNext()){
    String s = itr.next();
    System.out.println("s: " + s);
    if (s.equals("abd"))
        ts.add("abc");
}
Run Code Online (Sandbox Code Playgroud)

产量

Exception in thread "main" java.util.ConcurrentModificationException
Run Code Online (Sandbox Code Playgroud)