通过HashMap连续循环需要什么代码?

Ein*_*fus 1 java hashmap map concurrentmodification

目前我的代码导致间歇性的ConcurrentModificationException错误,可能是因为我循环遍历HashMap的方式:

for (Map.Entry<String, Entity> entry : entities.entrySet()) {
    String key = entry.getKey();
    Entity item = entry.getValue();
    if (item.isDestroyed()){
        entities.remove(key);
        ViewManager.getInstance().removeItem(key);
        //INSTRUCT THE ENTITY TO PERFORM IT'S DESTROYED BEHAVIOR item.Destroyed()                    
    } else {
        item.update(1);
        ConsoleItem ci = new ConsoleItemImpl(item.getIdentifier(), item.getLocation(), ColorStringConverter.getInstance().StringToColor(item.getSide()), item.getAngle(), item.getShape(), item.toString(), item.isDestroyed(), item.isDamaged());
        ViewManager.getInstance().updateItem(ci);                    
    }

    item.update(1);
}
// updateInfo call
ViewManager.getInstance().updateInfo(summary());
}
Run Code Online (Sandbox Code Playgroud)

如何通过HashMap连续循环并避免出现ConcurrentModificationException错误?

Coo*_*ans 5

循环浏览时无法修改地图.您要么必须复制地图,使用ConcurrentHashMap,要么使用迭代器.如果它在多线程环境中,则可以在同步块中进行修改.

另一种选择是使用迭代器.

我用下面的迭代器重写了for for循环:

for(Iterator<Map.Entry<String, Entity>> iterator = entities.entrySet().iterator(); iterator.hasNext(); ){
    Map.Entry<String, Entity> entry = iterator.next();
    String key = entry.getKey();
    Entity item = entry.getValue();
    if (item.isDestroyed()){
        //Notice using an iterator to remove 
        iterator.remove();
        ViewManager.getInstance().removeItem(key);
        //INSTRUCT THE ENTITY TO PERFORM IT'S DESTROYED BEHAVIOR item.Destroyed()                    
    } else {
        item.update(1);
        ConsoleItem ci = new ConsoleItemImpl(item.getIdentifier(), item.getLocation(), ColorStringConverter.getInstance().StringToColor(item.getSide()), item.getAngle(), item.getShape(), item.toString(), item.isDestroyed(), item.isDamaged());
        ViewManager.getInstance().updateItem(ci);                    
    }

    item.update(1);

}
Run Code Online (Sandbox Code Playgroud)

我不确定连续循环HashMap的部分.哈希映射具有一组有限的键,因此您通常会遍历键集.如果由于某种原因想要连续循环,那么你需要首先告诉我们背后的原因以及连续循环的终端条件(它真的不能永远,可以吗?).