Java - 在迭代HashMaps时保留数据类型的值

时间:2017-11-07 18:39:25

标签: java arraylist hashmap iterator

我试图遍历包含以下类型数据类型的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的邻居,以便将它们与其他值进行比较?如果我的问题不清楚,请告诉我,任何提示,修改或建议都会有所帮助。

2 个答案:

答案 0 :(得分:0)

使用参数化类型代替IteratorMap.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

我注意到一些奇怪的事情:

  1. 你不应该有以小写字母(城市,邻居)开头的课程
  2. 如果城市只有一个名为“city”的字段(字符串),您可以使用字符串来表示城市。
  3. 如果您的邻居类包含仅代表字符串的城市列表,您只需neighbors values = (neighbors) pair.getValue(); for (city c: values){ System.out.println("Test... " + c); } 代表城市列表。
  4. 您的地图变为List<String>,这更容易阅读,您不需要额外的课程。
  5. 您可以在完成这些更改后进行迭代,而无需使用强制转换。

    Map<String, List<String>>