我的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