tro*_*yal 37 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;
}
Run Code Online (Sandbox Code Playgroud)
我在for行中遇到错误:
incompatible types found : java.lang.Object required: MyClass.Key
该getData()方法返回一个Object(但在这种情况下Object返回的HashMap结构). MyClass.Key是我为我的应用程序创建的枚举(在另一个类文件中MyClass).
当我创建一个具有相同结构的foreach循环时MyClass.java,我没有遇到这个问题.
我究竟做错了什么?
Pau*_*lin 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();
Run Code Online (Sandbox Code Playgroud)
如果可能的话,定义"getData",这样你就不需要演员了.
Cra*_*lin 38
更改:
Map data = (HashMap<MyClass.Key, String>) getData();
Run Code Online (Sandbox Code Playgroud)
至
Map<MyClass.Key, String> data = (HashMap<MyClass.Key, String>) getData();
Run Code Online (Sandbox Code Playgroud)
问题是,如果数据只是a ,则data.keySet()返回Collection<Object>a Map.一旦你使它通用,keySet()将返回一个Collection<MyClass.Key>.甚至更好......迭代entrySet(),这将是一个Collection<MyClass.Key, String>.它避免了额外的哈希查找.
您可以改为获取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;
}
Run Code Online (Sandbox Code Playgroud)
我在java论坛上找到了这个简单的例子.它的语法与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());
}
Run Code Online (Sandbox Code Playgroud)
[编辑:]我测试了它,它完美地工作.