2016-07-04 2 views
3

Я пытаюсь удалить все значения NULL, но если treeSet последнего ключа имеет значение null, он остается там. Поэтому я думал, как удалить последнюю запись, если она равна нулю. Поскольку это treeMap, я думал, что могу получить последний элемент, обратившись к нему с помощью tm.lastKey(), но этот метод, похоже, не существует. Так что этот вопрос двоякий. Во-первых, есть ли способ удалить все нули, включая последний, а второй - где-то метод .lastKey()?Удаление записей treeMap с нулевыми значениями

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(); 
     } 
    } 
} 
+0

Не используйте необработанные типы. – shmosel

+0

Ваш 'tm' является' Map <> '. Естественно, методы 'TreeMap' не будут видны на нем. – Kayaman

+0

О да ... правильно –

ответ

5

Чтобы удалить все записи со значением null с вашей карты вы можете заменить метод deleteNull с

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

это действительно хорошо. спасибо –

+0

очень элегантный действительно – niceman

0

Java, TreeMap делает указать метод lastKey(). Вы можете увидеть это в Java-Doc для TreeMap.

Проблема в том, что вы не можете получить доступ к методу, потому что вы скрываете реальный тип вашей карты в своем методе. Вы можете увидеть здесь:

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

Исходя из этого, ваш метод только знает, что tm является Map объектом, и те, не метод lastKey(). Измените Map на TreeMap или сделайте бросок внутри вашего метода, тогда он будет работать.

Альтернатива 1:

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

Альтернатива 2:

public String lastKey() { 
    if (tm instanceof TreeMap<?, ?>) { 
     return ((TreeMap<String, SortedSet>) tm).lastKey(); 
    } else { 
     // Error! 
    } 
} 
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); 
    } 
} 
+0

не изменит размер набора после того, как некоторые записи были удалены? и поэтому мы либо получим исключение multhithread, либо ограничение границ? –

+0

хорошая попытка, но самым простым способом является ответ Modus на мой взгляд :) – niceman

Смежные вопросы