Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/vue.js/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何迭代Java链接的哈希映射?_Java_Hashmap_Loops - Fatal编程技术网

如何迭代Java链接的哈希映射?

如何迭代Java链接的哈希映射?,java,hashmap,loops,Java,Hashmap,Loops,我搜索了这个问题,找到了使用Map.Entry的答案,但是getValue()方法返回了一个Object对象,而不是Map中的对象类型。就像下面的例子一样,我需要它返回一个用户对象,这样我就可以使用该类中的方法。然而,当我尝试使用下面的while循环时,它从未离开过循环。我想知道做这件事的正确方法 Map<String, User> users = new LinkedHashMap<String, User>(); users.put(name, user); whi

我搜索了这个问题,找到了使用Map.Entry的答案,但是getValue()方法返回了一个Object对象,而不是Map中的对象类型。就像下面的例子一样,我需要它返回一个用户对象,这样我就可以使用该类中的方法。然而,当我尝试使用下面的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();
}
Map users=newlinkedhashmap();
users.put(名称、用户);
while(users.values().iterator().hasNext()){
currentUser=users.values().iterator().next();
currentUser.someMethod();
}

每次调用
.iterator()
,它都会在第一个元素处为您提供一个全新的迭代器

您需要调用一次
.iterator()
,并将其存储在局部变量中

我想知道做这件事的正确方法

Map<String, User> users = new LinkedHashMap<String, User>();
users.put(name, user);

while(users.values().iterator().hasNext()){

   currentUser = users.values().iterator().next();
   currentUser.someMethod();
}
您应该使用
Map.Entry
类型;您只需要提供用于泛型的类型参数:

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

您误用了迭代器,并且忽略了泛型规范

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

为此更改您的代码:

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

    while (it.hasNext())
    {

        currentUser = it.next();
        currentUser.someMethod();  
    }
Iterator it=users.values().Iterator();
while(it.hasNext())
{
currentUser=it.next();
currentUser.someMethod();
}
处理完集合后,必须从集合中删除“下一步”。 用你的代码,它是股票在“下一步”; 例如:如果“users.values()”返回一个集合,即

{{约翰,1},{仁,2},{彼得,3}

while循环始终返回true,因为它始终返回第一个索引处的“{john,1}”。 所以它是一个无限的“循环”。迭代器就是这样工作的。如果hasNext()在第一个索引处有一个元素,则它将返回true,而next()将返回hasNext()确认的元素

为了使循环继续进行,我认为必须添加一行或两行代码。见下文:

     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);
    }
Map users=newhashmap();
用户。放入(“1”、“John”);
用户。放入(“2”、“彼得”);
用户。put(“3”,“uche”);
迭代器coll=users.values().Iterator();
while(coll.hasNext()){
字符串currentUser=coll.next();
系统输出打印(当前用户);
//coll.remove(当前用户);
}
希望这有帮助


我以前的代码可能不是这样做的“正确”方式,但它完成了任务,并且没有跳过任何第二个元素@EJP。谢谢你让我直截了当……)

最简单的方法是使用。在LinkedHashMap中是这样的:

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

   for(Integer key : dataBase.keySet()) {
         String ret = dataBase.get(key);
    }
私有静态LinkedHashMap数据库=新建LinkedHashMap();
for(整数键:dataBase.keySet()){
字符串ret=dataBase.get(key);
}

当您需要键和值时,
Map.Entry
方法是正确的方法。如果
getValue()
的编译时返回类型是一个
对象
,那么您很可能在
映射项
声明中缺少类型参数。您是否尝试调试它并查看它卡住的地方?@MattBall好的,我会再试一次。@loveToCode是的,它只会继续执行while循环和.next()方法每次都返回相同的对象,比如
Iterator temp=users.values.Iterator()?那么我可以做
entry.getValue().someUserMethod()
@user1875021因为他已经告诉你
entry.getValue()
属于
User
类型,所以答案应该是显而易见的。您可以随时尝试。@user1875021绝对可以
entry.getValue()
属于
User
类型,您可以使用它执行任何操作。使用
entrySet()
有什么好处?他不使用该键,因此迭代
values()
完全可以完成任务,或者@findusl如果OP不打算使用该键,他当然应该使用
values()
;也许它在CPU周期方面会稍微经济一些。我的印象是循环中的代码不是一个完整的片段,我想给OP留下一些灵活性来访问键和值。啊,我明白了。我试过了,但对泛型不太熟悉,所以我一直得到一个对象。谢谢你不需要移除任何东西。你只需要正确地迭代。此代码将删除并跳过每秒钟一个元素-1.