删除具有空值的treeMap条目

时间:2016-07-04 20:14:42

标签: java dictionary treemap

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

public class Timing {
    private static Map<String, SortedSet> tm = new TreeMap<String, SortedSet>();

    public static Map manipulate() {
        SortedSet ss = new TreeSet();
        ss.add("APPL");
        ss.add("VOD");
        ss.add("MSFT");

        tm.put("2019-09-18",null);
        tm.put("2019-09-21",ss);
        tm.put("2019-09-22", null);
        tm.put("2019-09-20",ss);
        tm.put("2019-09-19", null);
        tm.put("2019-09-23",null);

        return tm;
    }

    public static void printMap() {
        for (String s: tm.keySet()) {
            System.out.println(s + ": " + tm.get(s));
        }
    }

    // Will delete all but the last one
    public static void deleteNull() {
        Set set = tm.entrySet();
        Iterator i = set.iterator();
        Map.Entry me = (Map.Entry) i.next();
        // there is no tm.lastKey()??
        while(i.hasNext()) {
            if (me.getValue() == null) {
                i.remove();
            }
            me = (Map.Entry) i.next();
        }
    }
}

3 个答案:

答案 0 :(得分:5)

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

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

答案 1 :(得分:0)

Java Unknown provider: offerProvider <- offer <- test确实指定了TreeMap方法。您可以在lastKey()的{​​{3}}中看到它。

问题是,您无法访问该方法,因为您将地图的实际类型隐藏到方法中。你可以在这里看到它:

TreeMap

由此,您的方法只知道private static Map<String, SortedSet> tm = new TreeMap<String, SortedSet>(); tm对象,而那些没有Map方法。将lastKey()更改为Map或在您的方法中进行转换,然后就可以了。

备选方案1:

TreeMap

备选方案2:

private static TreeMap<String, SortedSet> tm = new TreeMap<String, SortedSet>();

答案 2 :(得分:0)

执行此操作的绝对最简单的方法是在while循环结束后再次检查迭代器,如下所示:

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);
    }
}