迭代如何在HashMap中排在第一位?

时间:2010-11-21 09:45:20

标签: java

我有HashMAp

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

我需要每个人最后一次。

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

4 个答案:

答案 0 :(得分: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的{​​{3}}的第一段以获取进一步的参考。

答案 1 :(得分:4)

编辑:我自己和马修显然对你的问题意味着什么有不同的解释。你的意思是你插入的逆序还是反向键的顺序?

如果您的意思是按键顺序,请按以下步骤操作:

使用有序的Map,如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));
}

答案 2 :(得分:1)

HashMap不保证任何订购。如果你使用LinkedHashMap,它将按插入顺序排列,但仍然没有方便的方法可以倒退。

一种方法是致电items.entrySet()。返回Set<Map.Entry>。然后,您可以获取集合的大小,调用toArray(),然后执行降序循环。

答案 3 :(得分: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