如何在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的回答是正确的。

我有两个笔记

  1. 不要使用toString += ... ,而是使用StringBuilder ,并将数据附加到它。

  2. 马丁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中进行另一个查找。