如何在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中进行另一个查找。