2012-01-27 84 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的實際值。