2015-11-19 131 views
1

我試圖以遞減順序或遞增順序遍歷哈希映射,但我沒有得到正確的輸出。散列值的散列值按遞減順序還是遞增順序鍵值?

這裏是我的地圖:

Hashmap<String Integer> hm= new Hashmap<String,Integer>(); 

這裏是我的價值觀:

Key Value 
Hi  4 
kumar 1 
Hello 1 
vivek 3 

我想是這樣的:

List<Integer> ValueList = new ArrayList<Integer>(hm.values()); 
       ArrayList<String> keyList = new ArrayList<String>(hm.keySet()); 

Collections.sort(ValueList); 
       Collections.reverse(keyList); 
       Collections.reverse(ValueList); 

,我想這是這樣的:

Key Value 
kumar 1 
Hello 1 
vivek 3 
Hi  4 
+0

發佈您的代碼,請。 – Perdomoff

+1

尋求調試幫助的問題(「爲什麼這個代碼不工作?」)必須包含所需的行爲,特定的問題或錯誤以及在問題本身中重現問題所需的最短代碼。沒有明確問題陳述的問題對其他讀者無益。請參閱:如何創建最小,完整和可驗證示例。 – JFPicard

+1

我已更新我的代碼我正在嘗試 –

回答

0

我推薦使用Apache Commons CollectionsListOrderedMap。這裏的解決方案:

//Populate the map 
Map<String, Integer> map = new HashMap<>(); 
map.put("Hi", 4); 
map.put("kumar", 1); 
map.put("Hello", 1); 
map.put("vivek", 3); 

//Sort the values 
List<Integer> values = new ArrayList<Integer>(map.values()); 
Collections.sort(values); 

int size = values.size(); 
Set<Entry<String, Integer>> entries = map.entrySet(); 

//Create a new ordered map 
ListOrderedMap<String, Integer> orderedMap; 
orderedMap = ListOrderedMap.listOrderedMap(new HashMap<String, Integer>(map)); 

for (int i = 0; i < size; i++) { 

    Integer value = values.get(i); 
    Iterator<Entry<String, Integer>> iter = entries.iterator(); 

    while (iter.hasNext()) { 
     Entry<String, Integer> entry = iter.next(); 
     if (value.equals(entry.getValue())) { 
      //Put all values at index i that match the value 
      orderedMap.put(i, entry.getKey(), value); 
     } 
    } 
} 

//Print the orderedMap key/value pairs 
entries = orderedMap.entrySet(); 
for (Entry<String, Integer> entry : entries) { 
    final String key = entry.getKey(); 
    final Integer value = entry.getValue(); 
    System.out.println("key = " + key + ", value = " + value); 
} 

輸出:

key = Hello, value = 1 
key = kumar, value = 1 
key = vivek, value = 3 
key = Hi, value = 4 
0

您可以將Map視爲一組條目,其中每個條目都有一個鍵和一個值。所以你想要的是一個有序的條目列表。你不能只是排序鍵或值,因爲你會失去關聯鍵和值之間:

List<Map.Entry<String, Integer>> entries = new ArrayList<>(map.entrySet()); 
entries.sort(Comparator.comparing(Map.Entry::getValue)); 
0

如果您需要經常訪問這些值,您可以通過使用一個TreeMap對象避免排序。

http://docs.oracle.com/javase/8/docs/api/java/util/TreeMap.html

這種特殊Map可以像一個正常的HashMap與附加功能,它會自動使用他們ComparableEqualsHash方法(你必須override

如果你的鑰匙排序你可以定義你自己的Key Class,你可以創建它,這樣它會自動對你的值進行排序。

如果你不需要這樣的性能提升,提取值然後用Collections.sort對它們進行排序也可以。