我搜索了这个问题并找到了使用像here这样的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();
}
答案 0 :(得分:23)
我想知道正确的方法。
您应该使用Map.Entry
类型;你只需要提供用于泛型的类型参数:
for (Map.Entry<String,User> entry : users.entrySet()) {
// entry.getValue() is of type User now
}
答案 1 :(得分:17)
你误用了迭代器,你忽略了泛型规范。
Iterator<User> it = users.values().iterator();
while (it.hasNext())
{
User currentUser = it.next();
currentUser.someMethod();
}
答案 2 :(得分:4)
最简单的迭代方法是使用for。在LinkedHashMap中,它将是这样的:
private static LinkedHashMap<Integer, String> dataBase = new LinkedHashMap<Integer, String>();
for(Integer key : dataBase.keySet()) {
String ret = dataBase.get(key);
}
答案 3 :(得分:3)
每次调用.iterator()
时,它会在第一个元素处为您提供一个全新的迭代器。
您需要调用.iterator()
一次并将其存储在本地变量中。
答案 4 :(得分:0)
为此更改您的代码:
Iterator<User> it = users.values().iterator();
while (it.hasNext())
{
currentUser = it.next();
currentUser.someMethod();
}
答案 5 :(得分:-2)
在处理完毕后,您必须从集合中删除“next”。 使用您的代码,它是“下一个”的库存; 例如:如果您的“users.values()”返回一个集合,即
{{john,1},{jen,2},{peter,3}}
你的while循环保持返回true,因为它一直返回“{john,1}”,这是第一个索引。 所以它是一个无限的“循环”。这就是Iterator的工作原理。如果hasNext()在第一个索引处有一个元素,则nextNext()将返回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。谢谢你让我直截了当.. :))