Как выполнить итерацию через карту Java Linked Hash?

Я искал этот вопрос и нашел ответы, которые использовали 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();
}

Ответы

Ответ 1

Вы неправильно используете Итератор, и вы опускаете спецификации Generics.

Iterator<User> it = users.values().iterator();
while (it.hasNext())
{
  User currentUser = it.next();
  currentUser.someMethod();
}

Ответ 2

Мне было интересно, как правильно это сделать.

Вы должны использовать тип Map.Entry; вам просто нужно указать параметры типа для использования с дженериками:

for (Map.Entry<String,User> entry : users.entrySet()) {
    // entry.getValue() is of type User now
}

Ответ 3

Каждый раз, когда вы вызываете .iterator(), он дает вам новый итератор в первом элементе.

Вам нужно вызвать .iterator() один раз и сохранить его в локальной переменной.

Ответ 4

Самый простой способ использования iterare - использовать. В LinkedHashMap это будет так:

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

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

Источник

Ответ 5

измените код для этого:

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

    while (it.hasNext())
    {

        currentUser = it.next();
        currentUser.someMethod();  
    }

Ответ 6

Вам нужно удалить "next" из коллекции после того, как она была обработана. с вашим кодом, это запас на "следующий"; Например: если ваш "users.values ​​()" возвращает коллекцию i.e

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

Ваши циклы while сохраняют значение true и потому, что он продолжает возвращать "{john, 1}", который находится по первому индексу. и поэтому это бесконечный "цикл". Вот как работает Итератор. hasNext() вернет true, если у него есть элемент в первом индексе, а next() вернет тот элемент, у которого hasNext() подтвердил, что он имеет.

Чтобы ваша петля прогрессировала, я думаю, вам нужно добавить строку кода или 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. спасибо любым способом для меня прямо..:)