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才会发生。因此,如果diditerator it=whiteSet.iterator()
并对循环和修改使用“it”
,我就会得到异常,这就是我所理解的?是的,这是正确的。