JAVA中二维树映射中实例的删除

JAVA中二维树映射中实例的删除,java,treemap,Java,Treemap,嗨,我正在为我的学校做作业,我正在尝试从二维树映射中删除实例 无法在迭代集合时从集合中移除元素,这会导致错误 您应该使用这样一个事实,即您有维护元素顺序的TreeMap,因此您的项目已经根据日期进行排序了 您可以使用这个事实来简化您的代码和使用功能,并获得只包含日期更高的键的子映射 可以这样做,而不是修改现有的地图-使用上述方法创建一个新地图,并将其放在原始树中 obsah.put(name, obsah.get(name).tailMap(now)) 请注意,在迭代时修改(外部映射的)值

嗨,我正在为我的学校做作业,我正在尝试从二维
树映射中删除实例
无法在迭代集合时从集合中移除元素,这会导致错误


您应该使用这样一个事实,即您有维护元素顺序的
TreeMap
,因此您的项目已经根据
日期进行排序了

您可以使用这个事实来简化您的代码和使用功能,并获得只包含日期更高的键的子映射

可以这样做,而不是修改现有的地图-使用上述方法创建一个新地图,并将其放在原始树中

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

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

它会崩溃,因为在隐式迭代树映射时尝试删除元素(因为它会影响内部迭代索引)。您应该将要删除的键保留在临时数据结构中,并在迭代树映射后删除这些键

使用
迭代器
而不是内部循环:

Iterator<Map.Entry<Date, Integer>> i = produkt.entrySet().iterator();
Map.Entry<Date, Integer> e;
while (i.hasNext() && (e = i.next()) != null) {
    if (e.getKey().before(now)) {
         i.remove();
    }
}
Iterator i=produkt.entrySet().Iterator();
地图.条目e;
而(i.hasNext()&&(e=i.next())!=null){
如果(例如getKey().before(now)){
i、 删除();
}
}

这是一个巨大的挑战,因为对于内部迭代器,只允许使用
迭代器#remove()
。可能重复,但tailMap()返回sortedMap而不是TreeMap。。。我可以重新键入它吗?或者我应该如何更改类型?@joasik你真的在乎它是树形图还是分类图吗?如果你不这样做-更通用的SortedMap无论如何都是首选类型。它必须是TreeMap,因为我必须将它放回预定义的结构中(见上文)@joasik一个简单的解决方案是使用
新的TreeMap(obsah.get(name.tailMap)(现在)),使用构造函数,我相信实际返回的类型是一个树映射,但我不确定,也不能保证,因此比安全性更好sorry@joasisk
SortedMap
是一个接口,它不是一个具体的实现,我不知道它返回什么实现,但正如我所提供的,有一种替代方法,即只使用所描述的构造函数。很高兴我能帮忙。
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 (Date d: produkt.keySet()){
        System.out.println( d + " pocet:" + produkt.get(d));
        if (d.before(now)) {
            obsah.get(name).remove(d);
        }
    }
 obsah.put(name, obsah.get(name).tailMap(now))
Iterator<Map.Entry<Date, Integer>> i = produkt.entrySet().iterator();
Map.Entry<Date, Integer> e;
while (i.hasNext() && (e = i.next()) != null) {
    if (e.getKey().before(now)) {
         i.remove();
    }
}