2016-03-29 4 views
2
public static void main(String[] args) { 
    HashMap<String, String> hashMap = new HashMap<String, String>(); 
    hashMap.put("1", "adam"); 
    hashMap.put("2", "john"); 
    Set<String> keySet = hashMap.keySet(); 
    System.out.println(keySet); 
    Iterator<String> keySetIterator = keySet.iterator(); 
    while (keySetIterator.hasNext()) { 
    System.out.println("key is " + keySetIterator.next()); 
    if (keySetIterator.next() == null || keySetIterator.next() == "" || keySetIterator.next().isEmpty()) { 
     System.out.println("Key Is Empty or null"); 
    } else { 
     //String Key=keySetIterator.next(); 
     System.out.println("value is " + hashMap.get(keySetIterator.next())); 
    } 
    } 
} 

上記のコードでは、ハッシュマップを反復するためにイテレータを使用しています。スレッド "main"のジエット例外HashMapから要素を取得中にjava.util.NoSuchElementExceptionが発生する

しかし、例外が発生します

スレッドの例外「メイン」java.util.NoSuchElementException

私は、キーを取得することができていますが、私は値を取得していませんそのキーに対して

上記のコードに間違いがありますか?私が使用しているコードに誤りがありますか?

+1

あなたは代償として「次回」を呼びます。一度だけ呼びたいと思うかもしれません。 – SomeJavaGuy

答えて

2

ループの1回の反復でkeySetIterator.next()を何度も呼び出すのが間違いです。

毎回、イテレータを次の要素に進めます。

while (keySetIterator.hasNext()) { 
    String key = keySetIterator.next(); 
    // test key, retrieve item, etc. 
} 

しかし、ノートでは、あなたが実際にkeyがnullまたは空でないかどうかをチェックする必要はありません。

は、あなたが代わりにやるべきことは、あなたがすべてのテストを行う前に、参照を格納します。イテレータは、最初にセットに含まれていないキーを返すことはありません。

+0

返信ありがとう – Vaibs

1

各呼び出しkeySetIterator.next()は、次の要素を返します。だから、次の値を維持し、next()を呼び出す代わりに変数を使用する変数を使用する必要があります。

public static void main(String[] args) { 
    HashMap<String, String> hashMap = new HashMap<String, String>(); 
    hashMap.put("1", "adam"); 
    hashMap.put("2", "john"); 
    Set<String> keySet = hashMap.keySet(); 
    System.out.println(keySet); 
    Iterator<String> keySetIterator = keySet.iterator(); 
    while (keySetIterator.hasNext()) { 
    String nextValue = keySetIterator.next(); 
    System.out.println("key is " + nextValue); 

    if (nextValue == null || nextValue == "" || nextValue.isEmpty()) { 
     System.out.println("Key Is Empty or null"); 
    } else { 
     //String Key=keySetIterator.next(); 
     System.out.println("value is " + hashMap.get(nextValue)); 
    } 
    } 
} 
+0

@SashaSalauyouかもしれない)それは別の質問です) – Alexey

0

以降の.next()動きが一歩先の位置イテレータと、その位置に要素を返しますので、あなたは、すべてのチェックの前に一度next()を呼び出す必要があります:

String n = keySetIterator.next(); 
System.out.println("key is " + Objects.toString(n)); // avoid NPE if n is null 
if(n == null || n.isEmpty()) {      // remove redundant n == "" 
    System.out.println("Key Is Empty or null"); 
} // ... 
1

keySetIterator.next()が多すぎます。あなたのループの始めに文字列に値を入れてください。

String keyStr = keySetIterator.next(); 

ループ内でkeyStrを使用してください。

0

以下のセクションを削除してください。必須ではありません。マップが空の場合、keySetIterator.hasNext()はfalseを返します:

System.out.println("key is " +keySetIterator.next()); 
     if(keySetIterator.next()==null||keySetIterator.next()==""||keySetIterator.next().isEmpty()) 
     { 
      System.out.println("Key Is Empty or null"); 
     } 
関連する問題