我试图遍历包含以下类型数据类型的HashMap:
HashMap<city, neighbors>
city
是一个包含String值的对象,并在被调用时返回该字符串。以下是组成我的city
类的代码:
import java.util.*;
public class city{
String city;
public city(String s){
this.city = s;
}
public String toString() {
return this.city;
}
}
neighbors
是一个包含城市ArrayList的对象。以下是组成我的neighbors
类的代码:
import java.util.*;
public class neighbors extends ArrayList<city> {
public neighbors (city[] n) {
for (city v : n)
this.add(v);
}
}
我试图使用像这样的迭代器的常规约定来迭代这个哈希映射:
Iterator it = graph.entrySet().iterator();
while (it.hasNext()) {
Map.Entry pair = (Map.Entry)it.next();
System.out.println("Key :" + pair.getKey()); //prints the city System.out.println("Value :" + pair.getValue()); //prints the neighbors
//for (city c: pair.getValue()){
// System.out.println("Test... " + c);
//}
}
上面的迭代器运行良好,可以很好地打印getKey和getValue语句。我遇到的问题是我很难通过Map.Entry(这是一个ArrayList)的值来迭代。我已经注释掉的for循环是尝试完成此任务。我意识到getValue()
方法返回一个Object,但是如何保留Value的数据类型,这是一个ArrayList?我应该在neighbors
类中包含另一个方法,该方法遵循toString()
类的city
策略吗?如何迭代HashMap的邻居,以便将它们与其他值进行比较?如果我的问题不清楚,请告诉我,任何提示,修改或建议都会有所帮助。
答案 0 :(得分:0)
使用参数化类型代替Iterator
和Map.Entry
变量的原始类型:
Iterator<Map.Entry<city, neighbors>> it = graph.entrySet().iterator();
while (it.hasNext()) {
Map.Entry<city, neighbors> pair = it.next();
System.out.println("Key :" + pair.getKey()); //prints the city
System.out.println("Value :" + pair.getValue()); //prints the neighbors
for (city c: pair.getValue()){
System.out.println("Test... " + c);
}
}
答案 1 :(得分:0)
您可以将正在迭代的Object强制转换为邻居类。当然应该先进行类型检查。
this
我注意到一些奇怪的事情:
neighbors values = (neighbors) pair.getValue();
for (city c: values){
System.out.println("Test... " + c);
}
代表城市列表。List<String>
,这更容易阅读,您不需要额外的课程。您可以在完成这些更改后进行迭代,而无需使用强制转换。
Map<String, List<String>>