用于搜索(不同)整数的数据结构 Java

发布于 2024-11-15 03:22:59 字数 485 浏览 2 评论 0原文

我正在寻找一种针对搜索操作进行优化的数据结构(在 Java std-lib 中)。我必须对其进行多次迭代,控制每个元素并在特殊情况下删除它。我使用了 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)

I am looking for a data structure, optimized for search-operations (in the Java std-lib). I have to iterate over it several times, control every element and delete it in special cases. I have used a HashMap, but I always get following error:

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)

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(3

叹倦 2024-11-22 03:22:59

根据您的描述,您应该能够使用 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();
    }
}

From your description, you should be able to use HashMap for this. The key is to use iterator.remove() to delete entries:

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();
    }
}
∞梦里开花 2024-11-22 03:22:59

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

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

希望这有帮助!

That exception is thrown when you add/remove(/edit) something in a collection while you're terating through it (in e.g. a for loop).

To solve this, you would use a 'lock' in a multi-threaded environment. If you're doing stuff inside the responsible for-loop itself, you can consider copying your datastructure to a secondary (temporary) one, and then iterate on only one of the two and do all the necessary actions on the other.

Hope this helps!

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文