2012-12-17 36 views
2

可能重複:
TreeMap sort by value按值排序地圖

請看看下面的代碼

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

public class Mapper 
{ 
    Map mMap; 

    public Mapper() 
    { 
     mMap = new HashMap(); 
     mMap.put("A",1); 
     mMap.put("B",2); 
     mMap.put("C",3); 
     mMap.put("D",4); 
     mMap.put("E",5); 
     mMap.put("F",6); 

    } 
} 

正如你所看到的,地圖包含,2數據類型。現在,我需要按價值對其進行排序,如果可能,請按降序排列,否則無法正常排序。但是,你知道像以下是不可能的

Map<String, int> treeMap = new TreeMap<String, int>(mMap); 

所以,我怎麼能進行排序呢?請幫忙。

+1

另外'地圖'是不是更多鈔票,你需要'地圖<字符串,整數>' – jlordo

+0

我不認爲HashMap中進行排序。你可以像@jlordo建議的那樣查看TreeMap –

回答

2
Map<String, Integer> mMap = new HashMap<String, Integer>(); 
     mMap.put("A",1); 
     mMap.put("B",2); 
     mMap.put("C",3); 
     mMap.put("D",4); 
     mMap.put("E",5); 
     mMap.put("F",6); 


private static Map sortByComparator(Map unsortMap) { 

     List list = new LinkedList(unsortMap.entrySet()); 

     // sort list based on comparator 
     Collections.sort(list, new Comparator() { 
      public int compare(Object o1, Object o2) { 
       return ((Comparable) ((Map.Entry) (o1)).getValue()) 
             .compareTo(((Map.Entry) (o2)).getValue()); 
      } 
     }); 


     Map sortedMap = new LinkedHashMap(); 
     for (Iterator it = list.iterator(); it.hasNext();) { 
      Map.Entry entry = (Map.Entry) it.next(); 
      sortedMap.put(entry.getKey(), entry.getValue()); 
     } 
     return sortedMap; 
    } 
+0

這工作。謝謝 :) –

0

使用TreeMap,如果你想按鍵排序。

如果您希望按值排序映射,請創建一個按值排序的鍵列表。

您需要比較器通過比較相應的值來對鍵進行排序。

public static <K, V extends Comparable<? super V>> List<K> getKeysSortedByValue(Map<K, V> map) { 
    final int size = map.size(); 
    final List<Map.Entry<K, V>> list = new ArrayList<Map.Entry<K, V>>(size); 
    list.addAll(map.entrySet()); 
    final ValueComparator<V> cmp = new ValueComparator<V>(); 
    Collections.sort(list, cmp); 
    final List<K> keys = new ArrayList<K>(size); 
    for (int i = 0; i < size; i++) { 
     keys.set(i, list.get(i).getKey()); 
    } 
    return keys; 
} 

private static final class ValueComparator<V extends Comparable<? super V>> 
            implements Comparator<Map.Entry<?, V>> { 
    public int compare(Map.Entry<?, V> o1, Map.Entry<?, V> o2) { 
     return o1.getValue().compareTo(o2.getValue()); 
    } 
}