2010-04-21 164 views
34

在java中,如果我正在循環訪問HashMapkeySet(),我該如何(在循環內部)獲取該鍵的數字索引?Java - 獲取HashMap中的密鑰索引?

基本上,當我通過地圖循環時,我希望能夠得到0,1,2 ......我認爲這將比每次迭代聲明一個int並遞增更清晰。

謝謝。

+3

你需要什麼?正如答案中所提到的,在地圖中的順序不一定是固定的,當鍵被添加或刪除時它可以改變。 – extraneon 2010-04-21 19:54:16

+5

更好的是兩個相等的HashMap仍然可以有不同的順序。他們可以做到這一點*即使他們有相同的添加/刪除歷史*(不同的能力會做到這一點)。 – 2010-04-21 20:08:05

+0

http://stackoverflow.com/questions/18188739/arraylist-of-hashmap-or-linkedhashmap-to-get-item-by-index/18959271#18959271 – 2013-09-23 12:36:17

回答

4

簡而言之,基於散列的集合沒有編入索引,因此您必須手動完成。

+0

在這種情況下推薦的數據結構是什麼? – 2016-01-24 20:27:26

18

HashMap沒有定義鍵的順序。

8

你不能 - 一組是無序的,所以沒有提供索引。正如你所說,你必須聲明一個int。請記住,下次您調用keySet()時,您不一定會以相同的順序得到結果。

+1

如果OP確實需要這樣做,那麼編寫由TreeSet和Map支持的集合並不困難。這樣,您可以始終以相同的順序獲得結果。現在至於如何在迭代期間修改Map時的行爲取決於OP,但是數據結構是鍵在有序集中的映射是絕對可行的。 (順便說一句,我更多地評論你的答案,而不是OP的問題)。 – SyntaxT3rr0r 2010-04-21 20:07:17

36

不知道這是什麼「清潔劑」,而是:

List keys = new ArrayList(map.keySet()); 
for (int i = 0; i < keys.size(); i++) { 
    Object obj = keys.get(i); 
    // do stuff here 
} 
+1

或類似的:'int index = 0; for(Object key:map.keySet()){'Object value = map.get(key); ++索引; } // dang格式化 – benjineer 2015-12-01 09:40:06

10

如果你正在試圖做的就是值了HashMap的本身,你可以這樣做以下:

for (Object key : map.keySet()) { 
    Object value = map.get(key); 
    //TODO: this 
} 

或者,您也可以在地圖的條目迭代,如果這是你所感興趣的東西:

for (Map.Entry<Object, Object> entry : map.entrySet()) { 
    Object key = entry.getKey(); 
    Object value = entry.getValue(); 
    //TODO: other cool stuff 
} 

由於一個社區,如果我們知道你爲什麼需要這些索引或者你認爲索引可以爲你做什麼,我們可能會給你更好/更合適的答案。

45

使用LinkedHashMap的,而不是HashMap的 它總是返回相同的順序鍵(如插入)調用鍵設置()

有關更多詳細信息,請參閱Class LinkedHashMap

+0

順序可能並不重要 - 例如,我們可能只需要測試第一個或最後一個讀取對。 – benjineer 2015-12-01 09:50:39

4

我最近學習落後HashMap和的概念時很明顯,鍵沒有明確的排序。 要迭代可以使用:

Hashmap<String,Integer> hs=new Hashmap(); 
for(Map.Entry<String, Integer> entry : hs.entrySet()){ 
     String key=entry.getKey(); 
     int val=entry.getValue(); 
     //your code block 
    } 
2

發佈這是一個同樣可行的替代@Binil托馬斯的答案 - 試圖將其添加爲一個評論,但不相信這一切的可讀性。

int index = 0; 

for (Object key : map.keySet()) { 
    Object value = map.get(key); 
    ++index; 
} 

可能不利於原題的海報,因爲這是他們試圖避免字面的情況,但可以幫助別人尋找一個簡單的答案。