如何在hashmap中通过hashcode对随机值进行排序

时间:2012-01-27 17:57:40

标签: java hashmap hashcode

我有一个简单的类,它填写了一个简单的hashmap,我想通过hashcode对这些值进行排序怎么做?

import java.util.HashMap;
import java.util.Map;
import java.util.Random;

    public class Ch11Ex18 {
        public static void main(String[] args) {
            Random rand = new Random(47);
            Map<Integer,Integer> m = new HashMap<Integer,Integer>();
            for(int i = 0; i < 10000; i++) {
              // Produce a number between 0 and 20:
              int r = rand.nextInt(20);
              Integer freq = m.get(r);
              m.put(r, freq == null ? 1 : freq + 1);

            }
            System.out.println(m);
          }
    }

4 个答案:

答案 0 :(得分:3)

你没有:HashMap本质上是无序的。

您可以将TreeMap与自定义比较器一起使用,但是您应该知道,如果您使用具有相同哈希码的不等对象,那么其中只有一个会在地图中结束......甚至如此这可以通过而不是值来排序。

您可以创建一个包含值副本的ArrayList<Integer>,并将排序 - 但是您将无法获得密钥。

您可以创建一个包含条目副本的ArrayList<Map.Entry<Integer, Integer>>,并对其进行排序......但实际上,重点是什么?

从根本上说,这是一个奇怪的事情 - 基本上,哈希码应该这样使用。它们不是唯一的,不应该被视为随机性的来源,等等。无论这里的大局如何,几乎必然会有更好的方法。

答案 1 :(得分:2)

TreeMap按键排序。

Map yourMap= new HashMap();
// Enter values
Map sortedMap = new TreeMap(yourMap);

答案 2 :(得分:2)

在您的情况下,由于Integer.hashCode()等于实际数字,您只需将映射插入TreeMap,它们就会相应地进行排序。

答案 3 :(得分:1)

HashMap的迭代顺序是键的哈希码的自然排序(因为哈希值决定了桶,桶是按顺序迭代的),所以你可以迭代map.keySet()。对于键类型Integer,哈希码等于Integer的实际值。