16

この質問を検索して、ここのようにMap.Entryを使用する回答を見つけましたが、getValue()メソッドは、マップ内のオブジェクトのタイプではなくObjectオブジェクトを返しました。以下の例のように、Userオブジェクトを返すために必要なので、そのクラスのメソッドを使用できます。ただし、以下のwhileループを使用してみたところ、ループから外れることはありません。私はこれを行う正しい方法を考えていました。

Map<String, User> users = new LinkedHashMap<String, User>();
users.put(name, user);

while(users.values().iterator().hasNext()){

   currentUser = users.values().iterator().next();
   currentUser.someMethod();
}
4

6 に答える 6

23

私はこれを行う正しい方法を考えていました。

Map.Entryタイプを使用する必要があります。ジェネリックスで使用する型パラメーターを指定する必要があります。

for (Map.Entry<String,User> entry : users.entrySet()) {
    // entry.getValue() is of type User now
}
于 2012-12-06T01:41:11.700 に答える
19

Iteratorを誤用していて、Genericsの仕様を省略しています。

Iterator<User> it = users.values().iterator();
while (it.hasNext())
{
  User currentUser = it.next();
  currentUser.someMethod();
}
于 2012-12-06T01:42:12.990 に答える
4

反復する最も簡単な方法は、を使用することです。LinkedHashMapでは、次のようになります。

   private static LinkedHashMap<Integer, String> dataBase = new LinkedHashMap<Integer, String>();

   for(Integer key : dataBase.keySet()) {
         String ret = dataBase.get(key);
    }

ソース

于 2014-06-26T01:08:34.090 に答える
3

を呼び出すたび.iterator()に、最初の要素でまったく新しいイテレータが提供されます。

.iterator()一度呼び出して、ローカル変数に格納する必要があります。

于 2012-12-06T01:34:14.820 に答える
0

このためにコードを変更します。

Iterator<User> it = users.values().iterator();

    while (it.hasNext())
    {

        currentUser = it.next();
        currentUser.someMethod();  
    }
于 2012-12-06T01:46:38.230 に答える
-2

処理が完了したら、コレクションから「次へ」を削除する必要があります。あなたのコードで、それは「次」に在庫があります。例:「users.values()」がコレクションを返す場合、つまり

{{john、1}、{jen、2}、{peter、3}}

whileループはtrueを返し続けます。これは、最初のインデックスにある「{john、1}」を返し続けるためです。したがって、それは無限の「ループ」です。これがイテレータの仕組みです。hasNext()は、最初のインデックスに要素がある場合はtrueを返し、next()は、hasNext()が持っていることを確認した要素を返します。

ループを進めるには、コードを1行追加する必要があると思います。2。以下を参照してください。

     Map<String, String> users = new HashMap<String, String>();
    users.put("1", "John");
    users.put("2", "peter");
    users.put("3", "uche");
     Iterator<String> coll = users.values().iterator();
        while(coll.hasNext()){


       String currentUser = coll.next();
       System.out.print(currentUser);

      //coll.remove(currentUser);
    }

お役に立てれば..

私の以前のコードはそれを行うための「正しい」方法ではないかもしれませんが、仕事をし、EJPで2番目の要素をスキップしませんでした。私をまっすぐにしてくれてありがとう..:)

于 2012-12-06T02:46:07.697 に答える