[英]How can I extract ArrayList from HashMap and loop through it in Java?
[英]How do I use a foreach loop in Java to loop through the values in a 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循環時,我沒有遇到這個問題。
我究竟做錯了什么?
一種稍微有效的方法:
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只是一個Map
, data.keySet()
返回一個Collection<Object>
。 一旦你使它成為通用的, keySet()
將返回Collection<MyClass.Key>
。 甚至更好......遍歷entrySet()
,它將是Collection<MyClass.Key, String>
。 它避免了額外的哈希查找。
我在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());
}
[編輯:]我測試了它,它完美地工作。
您可以改為使用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;
}
莫特林的回答是正確的。
我有兩個筆記......
不要使用toString += ...
,而是使用StringBuilder
並將數據附加到它。
馬丁建議的演員會給你一個未經檢查的警告,你將無法擺脫它,因為它真的不安全。
另一種方式,沒有警告(和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
是更好的方法,因為它不需要在map中進行另一次查找。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.