java - JAVA中删除二维TreeMap中的实例

标签 java treemap

嗨,我正在为学校做作业,正在尝试从二维 TreeMap<String, TreeMap<Date, Integer> 中删除实例并保持相同的结构

我的函数应该做到这一点:

public void vyhodExpirovane(){
    Date now = new Date(System.currentTimeMillis());
    TreeMap<Date, Integer> produkt;
    System.out.println(now);
    for (String name: obsah.keySet()){
        produkt = obsah.get(name);
        System.out.print(name + " pocet roznych" + produkt.size() + " datum");
        for (Date d: produkt.keySet()){
            System.out.println( d + " pocet:" + produkt.get(d));
            if (d.before(now)) {
                obsah.get(name).remove(d);
            }
        }
    }
}

我的 map 看起来像这样

<cheese , <Mar 10 10:58:02 CET 2015, 1>>
<apple , <Mar 10 10:58:02 CET 2015, 1> <Mar 10 11:58:02 CET 2015, 2>>

当从我的函数中删除第一次出现的 apple 并应该转到第二次时,它会崩溃:

Exception in thread "main" java.util.ConcurrentModificationException
at java.util.TreeMap$PrivateEntryIterator.nextEntry(Unknown Source)
at java.util.TreeMap$KeyIterator.next(Unknown Source)
at Chladnicka.vyhodExpirovane(Chladnicka.java:126)
at MainClass.main(MainClass.java:46)

位于内部 for 循环中 (for (Date d: produkt.keySet()))

知道为什么会崩溃吗?

最佳答案

    for (Date d: produkt.keySet()){
        System.out.println( d + " pocet:" + produkt.get(d));
        if (d.before(now)) {
            obsah.get(name).remove(d);
        }
    }

在迭代集合时无法从集合中删除元素,这会导致错误。

<小时/>

您应该使用 TreeMap 来维护元素的顺序,因此您的项目已经根据日期排序!

您可以利用这一事实来简化您的代码并使用 tailMap()功能并获取仅包含已具有更高日期的键的子图。

这可以代替修改现有 map - 使用上述方法创建一个新 map ,并将其放入原始树中。

 obsah.put(name, obsah.get(name).tailMap(now))

请注意,在迭代时修改(外部映射的)不会导致此异常。

关于java - JAVA中删除二维TreeMap中的实例,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28961991/

相关文章:

java - 虚拟键盘隐藏了屏幕的数据元素

Java - 为一个值保留 2 个键(TreeMap)

java - 使 TreeMap 比较器容忍 null

java - 在java上通过TLE的代码优化建议

java - 为什么我们不能直接通过具体类来实现集合接口(interface)?

java - spring数据中的多态查询

java - SimpleDateFormat 为 00 时减一月

java - 获取 TreeMap 中的特定值

java - 在 Java 中从旧 map 创建新 map 的优雅方式,同时保持元素的排序相同

java - com.sun.xml.ws.message.saaj.SAAJHeader 无法转换为 com.sun.xml.ws.security.opt.impl.outgoing.SecurityHeader