2014-12-06 33 views
-3

遍歷HashMap中在原有Java源代碼,我必須使用的entrySet迭代一個HashMap,例如:如何在沒有的entrySet

for (Map.Entry<String, String> e : new Hash<String, String>().entrySet()) { 
} 

我期待有一個更簡單的方法來遍歷一個HashMap類似以下內容:

package ro.ex; 

import java.util.HashMap; 
import java.util.Map; 

/** 
* Created by roroco on 11/17/14. 
*/ 

class Hash<K, V> extends HashMap<K, V> { 
    // how to implement? 
} 

public class Ex2 { 
    public static void main(String[] args) { 
     // i expect 

     for (Hash.Entry<String, String > e : new Hash<String, String>()) { 
     } 
    } 
} 

我的問題是怎麼實現呢?

+1

入口集不是唯一的方式來遍歷一個Map ...你可以使用keySet,values或者獲得鍵的interator等。 – markg 2014-12-06 04:00:09

+0

「更簡單的方式」你的意思是「不用鍵入'.entrySet()'」? – abl 2014-12-06 04:12:23

回答

2

實施Iterable<Map.Entry<K, V>>

class Hash<K, V> extends HashMap<K, V> implements Iterable<Map.Entry<K, V>> { 
    @Override 
    public Iterator<Entry<K, V>> iterator() { 
     return entrySet().iterator(); 
    } 
} 

這工作,因爲實施Iterable允許在for-each循環使用的類型。

+0

你忘了提到做這樣的事情是一個壞主意。 – 2014-12-06 04:59:55

+0

@StephenC隨意編輯。 – August 2014-12-06 05:00:42

1

作爲@ August的答案的補充,儘管Map可以直接迭代,但它也不是的好主意。

  • 您已經推出了一個新的Hash類,它不提供實質性的新功能。這真的只是一個便利班。額外的類意味着更多的類可以讀取並保持較大的運行時間佔用空間。

  • 爲了使用您的Hash類,您的其他代碼需要編碼爲Hash類,而不是Map接口。這使得不可能直接用不同的Map實現類型替換該映射。

  • 你的Hash類可以說是不直觀的。一個Map有三個(至少)方面可以迭代,但是您選擇了一個......因爲通常不明顯的原因。 (這就是爲什麼標準Map API沒有實現Iterable !!)

  • 當你定義的HashMap一個子類,可以防止優化掉在某些情況下,某些方法調用調度JIT編譯器。

現在沒有這些東西是一個「秀塞」 ......但另一方面,你取得的成績是保存〜10個字符的for循環。


1 - 這對您作爲原始作者可能不是問題。但其他人第一次遇到你的類Hash將不得不閱讀源代碼或javadoc找出什麼迭代它的真正意思...