以前我设置了一个ArrayList来包含记录对象。我已经用存储对象的HashMap替换了ArrayList,并使用个人的用户名字符串作为键。
此目录的类通过implements Iterable<Object>
实现了Iterable(只有一个问题,但为什么需要<Object>
?)。
用于迭代ArrayList的先前代码是:
public Iterator iterator() {
return records.iterator();
}
然后我使用这个迭代器来处理该类中的所有对象,如下所示:
for (Object o : directory) {
TelephoneRecords temp = (TelephoneRecords) o;
System.out.println(temp.toString());
}
不幸的是,HashMapName.iterable();似乎引发了问题,那么我如何使用HashMap来解决这个问题呢?
答案 0 :(得分:5)
如果您只对键感兴趣,可以遍历地图的keySet():
Map<String, Object> map = ...;
for (String key : map.keySet()) {
// ...
}
如果您只需要值,请使用值():
for (Object value : map.values()) {
// ...
}
最后,如果你想要键和值,请使用entrySet():
for (Map.Entry<String, Object> entry : map.entrySet()) {
String key = entry.getKey();
Object value = entry.getValue();
// ...
}
希望这会对你有所帮助。
答案 1 :(得分:1)
您可以遍历HashMap的entrySet。 entrySet包含键和值集。然后可以通过getKey()和getValue()访问键和值。这可以通过以下代码完成:
for (Map.Entry<String, Object> entry : map.entrySet()) {
String username = entry.getKey();
TelephoneRecord record = (TelephoneRecord)entry.getValue();
// Do something with username and record ...
}
你的疑问:
Object是HashMap的一个类型参数,它表示Iterable包含Objects。如果您的HashMap只应包含TelephoneRecords对象,请替换
implements Iterable<Object>
与
implements Iterable<TelephoneRecords>
这样你就说你的Iterable包含TelephoneRecords,这反过来可以让你避免转换并获得编译错误,而不是运行错误,如果你做错了(这是首选!)。这会将上面的代码改进为:
for (Map.Entry<String, TelephoneRecord> entry : map.entrySet()) {
String username = entry.getKey();
TelephoneRecord record = entry.getValue();
// Do something with username and record ...
}
答案 2 :(得分:0)
“似乎引发问题意味着什么?在HashMap中,您可以迭代键(map.keySet()
),值(map.values()
)或键值对(map.entrySet()
)。
答案 3 :(得分:0)
您可以使用hashmap中的entryset,然后以与您已经相同的方式迭代它。
for (Object o : Directory.getEntrySet()) {
}
此外,如果您键入您的hashmap,它将不再需要强制转换 -
Map<String, TelephoneRecords>
答案 4 :(得分:0)
我用records.iterator();
替换records.values().iterator();
(不起作用)解决了我的问题。看起来你不能直接在HashMap上迭代,但你可以迭代它中的值(对象)。
此外,获取和打印HashMap的内容的问题,我通过以下代码解决。它遍历目录中的TelephoneRecords对象,由TelephoneRecords o : directory
和目录类中的Iterator方法指定。然后将一个临时对象分配给正在迭代的TelephoneRecords对象,[custom] toString()方法用于打印出该特定TelephoneRecords对象的字符串。
for (TelephoneRecords o : directory) {
TelephoneRecords temp = (TelephoneRecords) o;
System.out.println(temp.toString());
}
我最后按照提供的帮助解决了我的小问题,使用Iterator<TelephoneRecords>
(而不是简单地使用Object)迭代目录对象中包含的TelephoneRecords对象。