【问题标题】:Data structure for searching (different) Integers Java用于搜索(不同)整数的数据结构 Java
【发布时间】:2011-09-13 01:59:25
【问题描述】:

我正在寻找一种针对搜索操作优化的数据结构(在 Java 标准库中)。我必须对其进行多次迭代,控制每个元素并在特殊情况下将其删除。我使用过 HashMap,但总是出现以下错误:

for (Edge e : edges) {
    if (special case)
    edges.remove(e);
}

java.util.ConcurrentModificationException
at java.util.HashMap$HashIterator.nextEntry(HashMap.java:810)
at java.util.HashMap$KeyIterator.next(HashMap.java:845)
at package.name.TFinder.nN(TFinder.java:83)
at package.name.TFinder.fIT(TFinder.java:56)
at package.name.Main.main(Main.java:215)

【问题讨论】:

标签: java optimization search hashmap standard-library


【解决方案1】:

根据您的描述,您应该可以为此使用HashMap。关键是使用iterator.remove()删除条目:

for (Iterator<Map.Entry<Key,Value>> it = map.entrySet().iterator(); it.hasNext();)
{
    Map.Entry<Key,Value> entry = it.next();
    // process the entry
    if(need to delete the entry) 
    {
        it.remove();
    }
}

【讨论】:

    【解决方案2】:

    当您在循环中添加/删除(/编辑)集合中的某些内容(例如 for 循环)时,将引发该异常。

    要解决这个问题,您可以在多线程环境中使用“锁”。如果您在负责的 for 循环本身内做一些事情,您可以考虑将您的数据结构复制到辅助(临时)一个,然后只迭代两个中的一个并在另一个上执行所有必要的操作。

    希望这会有所帮助!

    【讨论】:

    • 实际上,您可以使用 Copy-On-Write 集合来绕过锁定集合。只要对集合的修改很少,这是非常有效的。但在这种情况下,使用迭代器显然更好。
    【解决方案3】:

    【讨论】:

    • 为什么?这与问题有何关系?
    • 他不能使用通常的Hashmap,但它适合他的需要吗?还是我说的不对?
    猜你喜欢
    • 1970-01-01
    • 2023-03-20
    • 2016-12-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-03-09
    • 1970-01-01
    相关资源
    最近更新 更多