Java 迭代hashset并从中删除元素

Java 迭代hashset并从中删除元素,java,collections,iterator,Java,Collections,Iterator,我有一个while(whiteSet.size()>0)签入我的代码并在while块内调用dfs方法。该方法修改哈希集。为什么while循环从不出错 public class CycleInDG { Set<Vertex> whiteSet = new HashSet<>(); Set<Vertex> greySet = new HashSet<>(); Set<Vertex> blackSet = new Ha

我有一个
while(whiteSet.size()>0)
签入我的代码并在while块内调用
dfs
方法。该方法修改哈希集。为什么while循环从不出错

public class CycleInDG {
    Set<Vertex> whiteSet = new HashSet<>();
    Set<Vertex> greySet = new HashSet<>();
    Set<Vertex> blackSet = new HashSet<>();
    List<Integer> cyclePath = new ArrayList<>();
    Map<Vertex, Vertex> parentMap = new HashMap<>();
    Graph g = new Graph();

public boolean hasCycle() {
    Map<Integer, Vertex> map = g.getGraphMap();
    Collection<Vertex> vertices = map.values();
    for (Vertex vertex : vertices) {
        whiteSet.add(vertex);
    }
    while(whiteSet.size()>0) {
        parentMap.clear();
        if(dfs(whiteSet.iterator().next(), null)) {
            return true;
        }
    }
    return false;
}
public boolean dfs(Vertex current, Vertex parent) {
    moveVertex(current, whiteSet, greySet);
    for (Vertex vertex : current.getNeighbors()) {
        if(blackSet.contains(vertex)) {
            continue;
        }
        if(greySet.contains(vertex)) {
            parentMap.put(vertex, current);
            return true;
        }
        parentMap.put(vertex, current);
        boolean result = dfs(vertex, current);
        if(result) {
            return result;
        }
    }
    moveVertex(current, greySet, blackSet);
    return false;
}

public void moveVertex(Vertex v, Set<Vertex> src, Set<Vertex> dest) {
    src.remove(v);
    dest.add(v);
}
}
公共类循环索引{
Set whiteSet=newhashset();
Set greySet=newhashset();
Set blackSet=newhashset();
List cyclePath=new ArrayList();
Map parentMap=new HashMap();
图g=新图();
公共布尔hasCycle(){
Map Map=g.getGraphMap();
集合顶点=map.values();
用于(顶点:顶点){
添加(顶点);
}
while(whiteSet.size()>0){
parentMap.clear();
if(dfs(whiteSet.iterator().next(),null)){
返回true;
}
}
返回false;
}
公共布尔dfs(顶点当前、顶点父级){
移动顶点(当前、白集、灰集);
对于(顶点:current.getNeights()){
if(blackSet.contains(顶点)){
继续;
}
if(灰色集合包含(顶点)){
parentMap.put(顶点,当前);
返回true;
}
parentMap.put(顶点,当前);
布尔结果=dfs(顶点,当前);
如果(结果){
返回结果;
}
}
移动顶点(当前、灰集、黑集);
返回false;
}
公共空心移动顶点(顶点v、集合src、集合dest){
src.移除(v);
目的地添加(v);
}
}

您希望出现什么错误?如果在使用迭代器对象进行迭代时修改集合,将引发CME。集合无法在(whiteSet.size()>0)时查看
。为什么?您不需要保留迭代器。只有在修改后继续使用相同的迭代器时,CME才会发生。因此,如果did
iterator it=whiteSet.iterator()
并对循环和修改使用
“it”
,我就会得到异常,这就是我所理解的?是的,这是正确的。