如何在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; } 我得到一个错误的行,说:
不兼容的types 发现:java.lang.Object 必需:MyClass.Key
  getData()方法返回一个Object (但在这种情况下,返回的Object具有HashMap结构)。  MyClass.Key是我为我的应用程序创build的枚举(在另一个类文件MyClass )。 
 当我在MyClass.java创build一个具有相同结构的foreach循环时,我没有遇到这个问题。 
我究竟做错了什么?
一个更有效的方法来做到这一点:
  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”,所以你不需要演员。
更改:
 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> 。 它避免了额外的哈希查找。 
我在java论坛find了这个简单的例子。 它的语法与列表的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()); } 
[编辑:]我testing了它,它完美的作品。
你可以抓住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; } 
Motlin的回答是正确的。
我有两个笔记
- 
不要使用 toString += ...,而是使用StringBuilder,并将数据附加到它。
- 
马丁build议的演员会给你不受限制的警告,你不能摆脱,因为它是非常不安全的。 
另一种方式,没有警告(并与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类中定义的,所以你根本不需要cast。 
 使用entrySet是更好的方法,因为它不需要在map中进行另一个查找。