2014-04-15 17 views
0

我想排序基於其值是一個HashMap,爲什麼不即使使用collections.reverse()排序後,在java中的ArrayList

我這樣做是分離HashMap中的鍵集和valueset方式成兩個ArrayList中 ,然後單獨排序列表,然後經過一番比較操作 但出於某種原因collection.reverse(LIST)增加值在新haspMap,將不在該列表按降序排列

下面是整理我的代碼:

public LinkedHashMap sortHashMapByValuesD(HashMap passedMap) 
    { 
     ArrayList <Integer>mapKeys = new ArrayList<Integer>(passedMap.keySet()); 
     ArrayList <Double>mapValues= new ArrayList<Double>(passedMap.values()); 
     Collections.reverse(mapValues); 
     Collections.reverse(mapKeys); //>>**Here the list won't sort for some reason** 



     LinkedHashMap<Integer, Double> sortedMap = new LinkedHashMap<Integer, Double>(); 

     Iterator valueIt = mapValues.iterator(); 
     while (valueIt.hasNext()) { 
      Object val = valueIt.next(); 
      //System.out.println(val); 
      Iterator keyIt = mapKeys.iterator(); 

      while (keyIt.hasNext()) { 
       Object key = keyIt.next(); 

       Double comp1 =(Double)passedMap.get(key); 

       Double comp2 = (Double)val; 

       if (comp1==comp2){ 

        passedMap.remove(key); 
        mapKeys.remove(key); 
        sortedMap.put((Integer)key,(Double)val); 
        break; 
       } 

      } 

     } 
     return sortedMap; 
    } 

在此先感謝

+2

collection.revers用於反轉,而不是排序,你也整理HashMap中的概念犯規聲音對我好:( – stinepike

+0

以及我想拿出一些關於地圖的排序, 所以基本上我需要做排序,然後尊敬按降序排序集合? – Snedden27

+0

所有你需要做的是'Collections.sort(mapValues)',然後'Collections.reverse(mapValues)',我想。你使用,讓你知道他們做了什麼方法 – njzk2

回答

1

HashMaps are hashed,沒有排序。特別是,HashMap<K, V>不實現SortedMap<K, V>接口。如果您想要按鍵排序的地圖,請嘗試TreeMapSortedMap的任何其他實施。

按索引排序的地圖不是通常要求的,並且不直接在rt.jar中支持。你甚至不能稱它們爲SortedMaps,因爲按值排序的地圖肯定是(幾乎)而不是按鍵排序。雖然可以實現按值排序的映射,但您可能會發現稍微不同的方法適合該法案,同時堅持Java的集合框架的哲學。嘗試創建一個支持地圖的集合或迭代器,它提供您需要的排序,並將原始HashMap用作其存儲。

一個更簡單的解決辦法是

Set<Double> sortedSet = new TreeSet<Double>(yourPreferredComparator); 
sortedSet.addAll(passedMap.values()); 

但是你會失去與此解決方案的任何重複值。

+0

然後它將按鍵排序,而不是值。 –

+0

LinkedHashMap是一個保持插入順序的地圖,這正是OP正在嘗試做什麼 – njzk2

+0

嗯,感謝您的意見,現在我寫的排序方法正在糾正代碼 下一次我可能會開始使用樹形圖代替 – Snedden27

相關問題