如何在Java中使用foreach循环来遍历HashMap中的值?

时间:2009-01-15 19:30:04

标签: java foreach hashmap

我正在尝试编译以下代码:

private String dataToString(){
    Map data = (HashMap<MyClass.Key, String>) getData();
    String toString = "";
    for( MyClass.Key key: data.keySet() ){
        toString += key.toString() + ": " + data.get( key );
    return toString;
}

我在for行中收到错误消息:

incompatible types
found : java.lang.Object
required: MyClass.Key

getData()方法返回Object(但在这种情况下,返回的Object具有HashMap结构。 MyClass.Key是我为应用程序创建的枚举(在另一个类文件中MyClass)。

当我在MyClass.java中创建一个具有相同结构的foreach循环时,我没有遇到这个问题。

我做错了什么?

5 个答案:

答案 0 :(得分:42)

这是一种更有效的方法:

  Map<MyClass.Key, String> data = (HashMap<MyClass.Key, String>) getData(); 
  StringBuffer sb = new StringBuffer();
  for (Map.Entry<MyClass.Key,String> entry : data.entrySet()) {
       sb.append(entry.getKey());
       sb.append(": ");
       sb.append(entry.getValue());
   }
   return sb.toString();

如果可能的话,定义“getData”,这样就不需要演员了。

答案 1 :(得分:38)

变化:

Map data = (HashMap<MyClass.Key, String>) getData();

Map<MyClass.Key, String> data = (HashMap<MyClass.Key, String>) getData();

如果数据只是data.keySet(),问题是Collection<Object>会返回Map。将其设为通用后,keySet()将返回Collection<MyClass.Key>。更好的是......迭代entrySet(),这将是Collection<MyClass.Key, String>。它避免了额外的哈希查找。

答案 2 :(得分:5)

我在java forum找到了这个简单的例子。它的语法非常类似于List的foreach ,这正是我所寻找的。

import java.util.Map.Entry;
HashMap nameAndAges = new HashMap<String, Integer>();
for (Entry<String, Integer> entry : nameAndAges.entrySet()) {
        System.out.println("Name : " + entry.getKey() + " age " + entry.getValue());
}

[编辑:]我测试过它,效果很好。

答案 3 :(得分:4)

您可以改为使用entrySet,以避免需要密钥类:

private String dataToString(){    
    Map data = (HashMap<MyClass.Key, String>) getData();    
    String toString = "";    
    for( Map.Entry entry: data.entrySet() ) {        
        toString += entry.getKey() + ": " + entry.getValue();
    }    
    return toString;
}

答案 4 :(得分:3)

Motlin的回答是正确的。

我有两张纸条......

  1. 请勿使用toString += ...,而是使用StringBuilder代替并附加数据。

  2. 马丁建议的演员会给你一个未经检查的警告,你将无法摆脱它,因为它真的不安全。

  3. 另一种方式,没有警告(和StringBuilder):

    private String dataToString(){
        Map<?, ?> data = (Map<?, ?>) getData();
        StringBuilder toString = new StringBuilder();
        for (Object key: data.keySet()) {
            toString.append(key.toString());
            toString.append(": ");
            toString.append(data.get(key));
        }
        return toString.toString();
    }
    

    这很有效,因为在key上调用的toString方法是在Object类中定义的,所以你根本不需要进行转换。

    使用entrySet是更好的方法,因为它不需要在地图中进行另一次查找。