簡體   English   中英

如何在Java中使用foreach循環來遍歷HashMap中的值?

[英]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只是一個Mapdata.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;
}

莫特林的回答是正確的。

我有兩個筆記......

  1. 不要使用toString += ... ,而是使用StringBuilder並將數據附加到它。

  2. 馬丁建議的演員會給你一個未經檢查的警告,你將無法擺脫它,因為它真的不安全。

另一種方式,沒有警告(和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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM