Java中Map的排序成績詳解。本站提示廣大學習愛好者:(Java中Map的排序成績詳解)文章只能為提供參考,不一定能成為您想要的結果。以下是Java中Map的排序成績詳解正文
Map的品種
在Java中,Map的重要感化是存儲鍵值對。因為是依據鍵獲得值,所以不許可鍵反復。它重要有以下幾個種別:
HashMap:
最經常使用的Map,它依據鍵的HashCode值存儲數據,依據鍵可以直接獲得它的值,具有很快的拜訪速度,遍用時,獲得數據的次序是完整隨機的。HashMap最多只許可一筆記錄的鍵為Null;許可多筆記錄的值為Null;HashMap不支撐線程的同步,即任一時辰可以有多個線程同時寫HashMap;能夠會招致數據的紛歧致。假如須要同步,可以用Collections的synchronizedMap辦法使HashMap具有同步的才能,或許應用ConcurrentHashMap。Hashtable與HashMap相似,它繼續自Dictionary類,分歧的是:它不許可記載的鍵或許值為空;它支撐線程的同步,即任一時辰只要一個線程能寫Hashtable,是以也招致了 Hashtable在寫入時會比擬慢。
LinkedHashMap
保留了記載的拔出次序,在用Iterator遍歷LinkedHashMap時,先獲得的記載確定是先拔出的.也能夠在結構時用帶參數,依照運用次數排序。在遍歷的時刻會比HashMap慢,不外有種情形破例,當HashMap容量很年夜,現實數據較少時,遍歷起來能夠會比LinkedHashMap慢,由於LinkedHashMap的遍歷速度只和現實數據相關,和容量有關,而HashMap的遍歷速度和他的容量有關。
TreeMap
完成SortMap接口,可以或許把它保留的記載依據鍵排序,默許是按鍵值的升序排序,也能夠指定排序的比擬器,當用Iterator 遍歷TreeMap時,獲得的記載是排過序的。
按鍵排序
從下面Map的品種引見我們可以看出,TreeMap是自帶按鍵排序的功效的,只須要在創立的時刻同時完成一個Compare的接口便可以了,例子以下:
private static void sort_by_key(){ Map<Integer, Integer> treeMap = new TreeMap<>(new Comparator<Integer>() { @Override public int compare(Integer o1, Integer o2) { return o2-o1; //倒序.這裡解釋一下,假如前往負值,則o1先輸入,反之則o2 } }); //填湊數據 for(int i = 0; i < 100;i++){ int key = (int)(10000*Math.random()); int value = (int)(10000*Math.random()); treeMap.put(key, value); } outMap(treeMap); } public static void outMap(Map<Integer, Integer> map){ for(Integer integer:map.keySet()){ System.out.println("key="+integer+" value="+map.get(integer)); } } /* 成果以下: key=9977 value=80 key=9684 value=7108 key=9422 value=1706 key=9264 value=1210 key=9248 value=4758 key=9024 value=7048 key=8892 value=3124 key=8879 value=6414 key=8814 value=8171 key=8728 value=1538 key=8513 value=4956 key=8462 value=5617 key=8355 value=8912 */
從下面可以看出,按鍵排序是不難的,而安頓排序就比擬費事一些,須要將Map轉一下。
按值排序
因為Java中Map並沒有此功效,所以我們須要本身完成。思緒以下:
Java中List是可使用compare接口的。
Map現實上就是Entry<>的聚集
那末應用List<Entry<>>便可以完成排序
將排好序的元素再拔出到LinkedMap中
代碼完成以下:
private static Map<Integer, Integer> sortMap(Map<Integer, Integer> linkedMap) { List<Map.Entry<Integer, Integer>> cache = new ArrayList<>(linkedMap.entrySet()); //重寫比擬函數 Collections.sort(cache,new Comparator<Map.Entry<Integer, Integer>>() { @Override public int compare(Entry<Integer, Integer> o1, Entry<Integer, Integer> o2) { //若前往值小於0,則o1在o2後面 return o2.getValue()-o1.getValue(); } }); Map<Integer, Integer> resultMap = new LinkedHashMap<>(); //將成果拔出LinkedMap然後前往 for(int i = 0; i < cache.size();i++){ resultMap.put(cache.get(i).getKey(), cache.get(i).getValue()); } return resultMap; } /*成果: 7965 9966 1067 9963 1720 9833 3257 9738 3934 9578 777 9348 1924 9315 3472 9270 3649 9114 5892 9078 */
如許,按值排序和按鍵排序就都可以完成了。