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<User> it = users.values().iterator();
while (it.hasNext())
{
  User currentUser = it.next();
  currentUser.someMethod();
}
于 2012-12-06T01:42:12.990 回答
4

最简单的迭代方法是使用 for。在 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()”返回一个集合,即

{{约翰,1},{詹,2},{彼得,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。感谢任何方式让我直截了当.. :)

于 2012-12-06T02:46:07.697 回答