2010-11-21 92 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

相关问题