如何遍历Java Linked Hash映射?

时间:2012-12-06 01:33:12

标签: java hashmap loops

我搜索了这个问题并找到了使用像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();
}

6 个答案:

答案 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);
    }

Source

答案 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。谢谢你让我直截了当.. :))