Java 删除具有空值的树映射项

Java 删除具有空值的树映射项,java,dictionary,treemap,Java,Dictionary,Treemap,我试图删除所有的空值,但是如果最后一个键的树集为空,那么它仍然存在。所以我在想,如果最后一个条目为空,如何删除它。由于这是一个树状图,我认为我可以通过使用tm.lastKey()访问最后一个元素来获得它,但该方法似乎不存在。所以这个问题是双重的。首先,有没有办法删除所有空值,包括最后一个空值,第二个空值是.lastKey()方法的位置 公共类计时{ 私有静态映射tm=newtreemap(); 公共静态映射操作(){ SortedSet ss=新树集(); ss.添加(“应用”); ss.添加(

我试图删除所有的空值,但是如果最后一个键的树集为空,那么它仍然存在。所以我在想,如果最后一个条目为空,如何删除它。由于这是一个树状图,我认为我可以通过使用tm.lastKey()访问最后一个元素来获得它,但该方法似乎不存在。所以这个问题是双重的。首先,有没有办法删除所有空值,包括最后一个空值,第二个空值是.lastKey()方法的位置

公共类计时{
私有静态映射tm=newtreemap();
公共静态映射操作(){
SortedSet ss=新树集();
ss.添加(“应用”);
ss.添加(“VOD”);
ss.添加(“MSFT”);
tm.put(“2019-09-18”,无效);
tm.put(“2019-09-21”,ss);
tm.put(“2019-09-22”,无效);
tm.put(“2019-09-20”,ss);
tm.put(“2019-09-19”,无效);
tm.put(“2019-09-23”,无效);
返回tm;
}
公共静态void printMap(){
对于(字符串s:tm.keySet()){
System.out.println(s+“:”+tm.get(s));
}
}
//将删除除最后一个之外的所有内容
公共静态void deleteNull(){
Set=tm.entrySet();
迭代器i=set.Iterator();
Map.Entry me=(Map.Entry)i.next();
//没有tm.lastKey()??
while(i.hasNext()){
if(me.getValue()==null){
i、 删除();
}
me=(Map.Entry)i.next();
}
}
}

Java
TreeMap
确实指定了
lastKey()
方法。您可以在for
TreeMap
中看到它

问题是,您无法访问该方法,因为您正在将映射的真实类型隐藏到方法中。你可以在这里看到:

private static Map<String, SortedSet> tm = new TreeMap<String, SortedSet>();
备选案文2:

public String lastKey() {
    if (tm instanceof TreeMap<?, ?>) {
        return ((TreeMap<String, SortedSet>) tm).lastKey();
    } else {
        // Error!
    }
}
公共字符串lastKey(){
if(树映射的tm实例){
return((TreeMap)tm).lastKey();
}否则{
//错误!
}
}

要从地图中删除所有值为
null
的条目,可以将
deleteNull
方法替换为

tm.values().removeIf(Objects::isNull);

最简单的方法是在while循环结束后再次运行check迭代器,如下所示:

while(i.hasNext()) {
    if (me.getValue() == null) {
        i.remove();
    }
    me = (Map.Entry) i.next();
}
if (me.getValue() == null) {
    i.remove();
}
    me = (Map.Entry) i.next();
这样,您将捕获最后一个值

但是,可以使用与打印地图类似的关键点集

Set<String> keySet = tm.keySet();
for(int ndx = 0; ndx < keySet.size(); ndx++){
    String key = keySet.get(ndx);
    if(tm.get(key) == null){
        tm.remove(key);
    }
}
Set keySet=tm.keySet();
对于(int ndx=0;ndx
不要使用原始类型。您的
tm
是一个
Map
。当然,
TreeMap
的方法在它上面是不可见的。在删除一些条目后,集合的大小不会改变吗?所以我们要么得到multhithread异常,要么得到indexout of bounds?很好的尝试,但最简单的方法是我认为Modus的答案:)确实非常优雅
while(i.hasNext()) {
    if (me.getValue() == null) {
        i.remove();
    }
    me = (Map.Entry) i.next();
}
if (me.getValue() == null) {
    i.remove();
}
    me = (Map.Entry) i.next();
Set<String> keySet = tm.keySet();
for(int ndx = 0; ndx < keySet.size(); ndx++){
    String key = keySet.get(ndx);
    if(tm.get(key) == null){
        tm.remove(key);
    }
}