Ответ 1
Вы неправильно используете Итератор, и вы опускаете спецификации Generics.
Iterator<User> it = users.values().iterator();
while (it.hasNext())
{
User currentUser = it.next();
currentUser.someMethod();
}
Я искал этот вопрос и нашел ответы, которые использовали 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();
}
Вы неправильно используете Итератор, и вы опускаете спецификации Generics.
Iterator<User> it = users.values().iterator();
while (it.hasNext())
{
User currentUser = it.next();
currentUser.someMethod();
}
Мне было интересно, как правильно это сделать.
Вы должны использовать тип Map.Entry
; вам просто нужно указать параметры типа для использования с дженериками:
for (Map.Entry<String,User> entry : users.entrySet()) {
// entry.getValue() is of type User now
}
Каждый раз, когда вы вызываете .iterator()
, он дает вам новый итератор в первом элементе.
Вам нужно вызвать .iterator()
один раз и сохранить его в локальной переменной.
Самый простой способ использования iterare - использовать. В LinkedHashMap это будет так:
private static LinkedHashMap<Integer, String> dataBase = new LinkedHashMap<Integer, String>();
for(Integer key : dataBase.keySet()) {
String ret = dataBase.get(key);
}
измените код для этого:
Iterator<User> it = users.values().iterator();
while (it.hasNext())
{
currentUser = it.next();
currentUser.someMethod();
}
Вам нужно удалить "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. спасибо любым способом для меня прямо..:)