2012-01-27 45 views
0

我有一个简单的类,填写一个简单的散列表我想通过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); 
      } 
    } 
+0

订购价值在哪里?只是打印它们?获取键,对它们进行排序,遍历它们并转储值。 – 2012-01-27 18:00:16

+0

proly导出到列表并使用hashCode比较器() – Adrian 2012-01-27 18:00:51

回答

3

您不:HashMap本质上是无序的。

你可以使用TreeMap自定义比较器,但是你应该知道,如果你使用具有相同哈希代码的不相等的对象,只有其中一个将最终在地图中...即使如此,这将命令由而不是值。

您可以创建一个包含值的副本的ArrayList<Integer>,并对进行排序,即 - 但您不会拥有密钥。

您可以创建ArrayList<Map.Entry<Integer, Integer>>,其中包含条目的副本,然后对其进行排序......但实际上,有什么意义?

基本上,这是一件很奇怪的事情 - 散列码应该是而不是基本上这样使用。它们不是独一无二的,不应被视为随机性的来源等。无论这里有什么更大的图景,这里肯定会有更好的方法。

2

TreeMap按键排序。

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

在你的情况下,由于Integer.hashCode()等于实际数量,你可以只需要插入您的映射成一个TreeMap,他们将进行相应的排序。

+0

+1这个答案比我的(现在删除)更短,更完整。 – user949300 2012-01-27 18:27:52

1

HashMap的迭代次序是密钥哈希码的自然排序(因为哈希值决定了桶并且桶依次迭代),所以您可以迭代map.keySet()。对于Integer类型的密钥,哈希码等于Integer的实际值。