【问题标题】:Sorting values in a HashMap对 HashMap 中的值进行排序
【发布时间】:2012-12-05 05:34:14
【问题描述】:

我有一个HashMap<Character, Integer>,我想将这些值按整数的升序放入PriorityQueue。我在想办法做到这一点时遇到了麻烦。我有一个可以保存值的Node 类,所以:PriorityQueue<Node>

【问题讨论】:

  • 改用SortedMap(例如TreeMap):docs.oracle.com/javase/6/docs/api/java/util/SortedMap.html
  • 我在发布之前查看了该线程,但我并不想对地图本身进行排序(由于哈希图的性质,这很复杂而且几乎不可能),而是以有序的方式选择它们。
  • yuushi,如果可以选择,我会使用树形图或链接哈希图:(
  • 是您创建的 Node 类还是您拥有 Node 类的编辑/子类访问权限?

标签: java sorting hashmap


【解决方案1】:

在这种情况下我不会使用Map....

编写您自己的 Pair/Node 类来保存您的 CharacterInteger,并使该类实现 Comparable

您可以阅读Comparable here

在您的节点类中,您必须实现 compareTo 方法,如下所示:

public int compareTo(Node o) {
    return this.idd - o.idd ;
}

其中 id 是保存整数的变量。

像这样,您可以将它们放在SortedSet 中,例如您在问题中提到的TreeSetPriorityQueue

【讨论】:

  • 好的,实现了可比较并覆盖了 compareTO,因此它返回 -1 表示小于,0 表示相等,1 表示大于。
  • 好的,现在只需将节点放入排序集合中,看看奇迹发生了。
  • 是的,我决定将它们全部放入优先级队列中,然后进行排序。 Collections.sort() 似乎不适用于我的优先级队列:( 好的,我重新阅读了 priorityQueue 上的文档,看起来它会自动排序。
  • 优先级队列将在插入时自动排序...如果不是您在实现可比较时犯了错误...当心泛型
【解决方案2】:

代码示例:

HashMap<Character, Integer> h = new HashMap<Character, Integer>();
h.put('z',30);
h.put('e',10);
h.put('b',20);
h.put('c',20);
List<Map.Entry> a = new ArrayList<Map.Entry>(h.entrySet());
Collections.sort(a,
                 new Comparator() {
                     public int compare(Object o1, Object o2) {
                         Map.Entry e1 = (Map.Entry) o1;
                         Map.Entry e2 = (Map.Entry) o2;
                         return ((Comparable) e1.getValue()).compareTo(e2.getValue());
                     }
                 });

for (Map.Entry e : a) {
        System.out.println(e.getKey() + " " + e.getValue());
}

输出(按 OP 要求按整数值排序):

e 10
b 20
c 20
z 30

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2016-08-15
    • 1970-01-01
    • 2012-04-30
    • 2016-01-21
    • 2011-12-28
    • 1970-01-01
    • 2014-12-11
    相关资源
    最近更新 更多