2010-11-21 62 views
6

我的HashMap如何在HashMap中迭代最後一次?

items = new HashMap<String, String>(); 
     items.put("A", "1"); 
     items.put("B", "2"); 
     items.put("C", "3"); 

我需要爲每個後到前。

"C", "3" 
"B", "2" 
"A", "1" 
+0

術語Last和First似乎表示時間。我看到的大多數答案都假設爲Last和First是語義的(例如,C大於A,因此最後)。如果您需要插入時間排序並且密鑰中沒有插入時間戳,OrderedMaps將無法爲您提供幫助。 – extraneon 2010-11-21 10:11:18

+1

'HashMap'不保證其元素的順序。特別是,它不能保證訂單在一段時間內保持不變。因此,如果您必須維護任何類型的訂單,「HashMap」不是您想要的。 – barjak 2010-11-21 10:46:40

回答

4

編輯:我自己和馬修顯然有不同的解釋你的問題的含義。你是指你插入的倒序,還是倒序鍵?

如果你的意思是反向的鍵的順序,這裏是如何做到這一點:

使用一個有序的地圖,像TreeMap和然後遍歷items.keySet()。

TreeMap的種種你的鍵值的自然順序,所以你需要在一個比較傳遞給構造函數以相反的順序按鍵排序:

Map<String, String> items = new TreeMap<String, String>(new Comparator<String>() { 
    public int compare(String a, String b) { 
    return b.compareTo(a); 
    } 
}); 

items.put("A", "1"); 
items.put("B", "2"); 
items.put("C", "3"); 

for (String s: items.keySet()) { 
    System.out.println(s + " " + items.get(s)); 
} 
+3

這個代碼是等價的:''Map items = new TreeMap (Collections.reverseOrder());' – barjak 2010-11-21 10:49:28

+0

哦酷 - 在 – iftheshoefritz 2010-11-21 10:58:14

1

HashMap不能保證任何排序。如果您使用LinkedHashMap,它將通過插入進行排序,但仍然沒有方便的方法來倒退。

一種方法是致電items.entrySet()。返回Set<Map.Entry>。然後你可以獲得該集合的大小,請致電toArray(),然後做一個循環降序。

0

另一種方法 - 創建密鑰的SortedSet的:

import java.util.*; 

class MyComparator implements Comparator<String> { 
    public int compare(String a, String b) { 
     return -a.compareTo(b); 
    } 

    public boolean equals(String a, String b) { 
     return a.equals(b); 
    } 
} 

public class test { 
    public static void main(String[] args) { 
     HashMap<String, String> items = new HashMap<String, String>(); 
     items.put("A", "1"); 
     items.put("B", "2"); 
     items.put("C", "3"); 

     TreeSet<String> ts = new TreeSet<String>(new MyComparator()); 
     ts.addAll(items.keySet()); 
     for(Iterator<String> i = ts.iterator(); i.hasNext();) { 
      String key = i.next(); 
      System.out.println("key: " + key + ", value: " + items.get(key)); 
     } 
    } 
} 

輸出:

 
key: C, value: 3 
key: B, value: 2 
key: A, value: 1 
+0

之前沒有見過你假設Last是在關鍵,但我認爲他的意思是插入時間。如果插入時間不在密鑰中,則比較器不能幫助您。 – extraneon 2010-11-21 10:13:10

+0

我不同意。我不認爲插入時間與它有任何關係。我認爲他犯了一個錯誤,認爲HashMap可以按照某種順序迭代,並且希望顛倒。我假設他的意思是按字母順序排列的。 – sje397 2010-11-21 12:29:17

6

您可以使用NavigableMapTreeMapNavigableMap),它是具有導航功能的SortedMap

NavigableMap#descendingMap()返回此映射中包含的映射的逆序視圖(不是副本)。

例子:

NavigableMap<String, String> items = new TreeMap<String, String>(); 
items.put("B", "2"); 
items.put("A", "1"); 
items.put("C", "3"); 

for (Map.Entry<String, String> e : items.entrySet()) { 
    System.out.println(e); 
} 
// gives 
// A=1 
// B=2 
// C=3 

for (Map.Entry<String, String> e : items.descendingMap().entrySet()) { 
    System.out.println(e); 
} 

// gives 
// C=3 
// B=2 
// A=1 

注:這個答案是有效的,如果你關心你的Map鍵的自然排序。如果您關心插入順序或訪問順序,請查看LinkedHashMap

注2:在您的問題中,您使用了HashMap。請注意,HashMap不保證其元素的任何順序。實際上,它甚至不保證訂單會隨着時間的推移保持不變。請參閱HashMap的第一段javadoc以獲得進一步參考。

+0

訂單基於關鍵語義。但我認爲問題是關於插入時間。因此,相反的順序不會對您有所幫助,因爲順序標準(插入時間)不是密鑰的一部分。 – extraneon 2010-11-21 10:15:04

+0

我添加了一個註釋來澄清事情 – barjak 2010-11-21 10:37:33

相關問題