2016-07-04 5 views
3

すべてのnullを削除しようとしていますが、最後のキーのtreeSetがnullの場合はnullが残っています。だから私はそれがnullの場合最後のエントリを削除する方法を考えていた。これはtreeMapなので、最後の要素はtm.lastKey()でアクセスすることで取得できますが、そのメソッドは存在しないようです。だからこの質問は二重です。まず、最後のものを含むすべてのnullを削除する方法があります.2番目の方法は、.lastKey()メソッドはどこですか?null値を持つ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

あなたとdeleteNullメソッドを置き換えることができ、あなたのマップからnullの値を持つすべてのエントリを削除するには

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

これは本当に良いです。ありがとう –

+0

非常にエレガント実際に – niceman

0

AのJava TreeMaplastKey()方法を指定しません。 Java-DocTreeMapで確認できます。

メソッドに実際のタイプのマップを隠しているため、メソッドにアクセスできないという問題があります。あなたはここでそれを見ることができます。このことから

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

、あなたの方法は、唯一のtmMapオブジェクトがあり、それらはlastKey()メソッドを持っていないことを知っています。 MapTreeMapに変更するか、メソッド内でキャストを行っても機能します。

オルタナティブ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(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

いくつかのエントリが削除された後にセットの変更のサイズはないでしょうか?したがって、マルチスレッド例外または境界のインデックスアウトを取得しますか? –

+0

良い試みが絶対的な最も簡単な方法は私の意見では、Modusの答えです:) – niceman

関連する問題