我的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"
我的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"
編輯:我自己和馬修顯然有不同的解釋你的問題的含義。你是指你插入的倒序,還是倒序鍵?
如果你的意思是反向的鍵的順序,這裏是如何做到這一點:
使用一個有序的地圖,像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));
}
這個代碼是等價的:''Map
哦酷 - 在 – iftheshoefritz 2010-11-21 10:58:14
HashMap不能保證任何排序。如果您使用LinkedHashMap
,它將通過插入進行排序,但仍然沒有方便的方法來倒退。
一種方法是致電items.entrySet()
。返回Set<Map.Entry>
。然後你可以獲得該集合的大小,請致電toArray()
,然後做一個循環降序。
另一種方法 - 創建密鑰的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
您可以使用NavigableMap
(TreeMap
是NavigableMap
),它是具有導航功能的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以獲得進一步參考。
術語Last和First似乎表示時間。我看到的大多數答案都假設爲Last和First是語義的(例如,C大於A,因此最後)。如果您需要插入時間排序並且密鑰中沒有插入時間戳,OrderedMaps將無法爲您提供幫助。 – extraneon 2010-11-21 10:11:18
'HashMap'不保證其元素的順序。特別是,它不能保證訂單在一段時間內保持不變。因此,如果您必須維護任何類型的訂單,「HashMap」不是您想要的。 – barjak 2010-11-21 10:46:40