關於java中Map排序問題

咱們在應用Map中排序問題時,會面臨不少問題(好比選擇哪一種類型的Map應用,如何實現按照本身特定要求進行排序等)。
1 什麼是Map
在數組中咱們是經過數組下標來對其內容索引的,而在Map中咱們經過對象來對對象進行索引,用來索引的對象叫作key,其對應的對象叫作value這就是咱們平時說的鍵值對。
2 HashMap和TreeMap 區別
HashMap:底層是哈希表數據結構。線程不一樣步。TreeMap:底層是二叉樹數據結構,線程不一樣步,可用於給Map集合中的鍵進行排序。
3 常規Map的實現
HashMap:基於哈希表實現。使用HashMap要求添加的鍵類明肯定義了hashCode()和equals()[能夠重寫hashCode()和equals()],爲了優化HashMap空間的使用,您能夠調優初始容量和負載因子。
(1)HashMap(): 構建一個空的哈希映像
(2)HashMap(Map m): 構建一個哈希映像,而且添加映像m的全部映射
(3)HashMap(int initialCapacity): 構建一個擁有特定容量的空的哈希映像
(4)HashMap(int initialCapacity, float loadFactor): 構建一個擁有特定容量和加載因子的空的哈希映像
TreeMap:基於紅黑樹實現。TreeMap沒有調優選項,由於該樹總處於平衡狀態。
(1)TreeMap():構建一個空的映像樹
(2)TreeMap(Map m): 構建一個映像樹,而且添加映像m中全部元素
(3)TreeMap(Comparator c): 構建一個映像樹,而且使用特定的比較器對關鍵字進行排序
(4)TreeMap(SortedMap s): 構建一個映像樹,添加映像樹s中全部映射,而且使用與有序映像s相同的比較器排序
4 性能
HashMap:適用於在Map中插入、刪除和定位元素。
Treemap:適用於按天然順序或自定義順序遍歷鍵(key)。 java



實際程序中,咱們應用HashMap的頻率要高於Treemap,那麼如何進行排序呢?我的找到了一下的一些方法,總結以下:
A 按照key排序
對於有排序的Map,如Tree’Map,只能按照鍵排序(用put 和remove方法進行添加和刪除)。如下方案,使用hashmap進行建立和添加,若是須要按照key排序,能夠將hashmap做爲參數傳遞到new TreeMap(hashmap),能夠完成按照key 排序。
TreeMap treemap = new TreeMap(hashmap);
B 按照value排序
通常狀況下選擇使用hashmap,經過添加比較器來完成。web

public class mapex {
//此函數只要功能是將HashMap按照值的大小進行排列輸出
        public static void main(String[] args) {
            //建立一個hashmap
                Map<String, Integer> keyMap = new      HashMap<String, Integer>();
            keyMap.put("009", 45);
            keyMap.put("010", 31);
            keyMap.put("003", 29);
            //將映射表傳入到arraylist中
            ArrayList<Entry<String, Integer>> list = new ArrayList<Map.Entry<String,Integer>>(keyMap.entrySet());
            //Collections包裝器,根據指定比較器產生的順序對指定列表進行排序。
            Collections.sort(list, new Comparator<Entry<String,Integer>>() {
                public int compare(Entry<String, Integer> o1,Entry<String, Integer> o2) {   
                    return (o1.getValue()-o2.getValue());
                }   
            });
            for (Entry<String, Integer> entry : list) {             System.out.println(entry.getKey()+">>>>>"+entry.getValue());
            }
        }
}

C Hashtable內部排列的方式是散列排布,因此當輸出信息時會是無序的,此類實現一個哈希表,該哈希表將鍵映射到相應的值。爲了能保證輸出的數據按照必定的順序排序,就不能用java自帶的函數對hashtable 進行處理,須要將hashtable 轉換成array(數組)後進行處理,咱們可使用array的sort,重寫compare方法,進行自定義排序。
/**
* 方法名稱:getSortedHashtable
* 參數:Hashtable h 引入被處理的散列表
* 描述:將引入的hashtable.entrySet進搜索行排序,並返回
*/
public class EntrySerielal {數組

public static Map.Entry[] getSortedHashtable(Hashtable h) {
       //返回此映射中包含的鍵的 Set 視圖。
       Set set = h.entrySet();
       //將set轉成array進行排序
       Map.Entry[] entries = (Map.Entry[]) set.toArray(new Map.Entry[set.size()]); 
       //使用arrays的sort方法,重寫compare方法
       Arrays.sort(entries,new Comparator() {
        public int compare(Object o1, Object o2) {
             Object key1 =  ((Map.Entry) o1).getKey();
             Object key2 =  ((Map.Entry) o2).getKey();
             return ((Comparable) key1).compareTo(key2);
        }   
       }) ;
       return entries;

       }
   public static void main(String[] args) {
       Hashtable t =new Hashtable(10);
       t.put("003", 25);
       t.put("001", 20);
       t.put("009", 95);
       Map.Entry[] set = getSortedHashtable(t);

       for (int i=0;i<set.length;i++){

           System.out.println(set[i].getKey().toString());

           System.out.println(set[i].getValue().toString());       
       }
   }
  }

「`數據結構