如何迭代Java链接的哈希映射?
我搜索了这个问题,找到了使用Map.Entry的答案,但是getValue()方法返回了一个Object对象,而不是Map中的对象类型。就像下面的例子一样,我需要它返回一个用户对象,这样我就可以使用该类中的方法。然而,当我尝试使用下面的while循环时,它从未离开过循环。我想知道做这件事的正确方法如何迭代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<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.