国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 編程 > Java > 正文

Java中Map的排序問題詳解

2019-11-26 14:38:41
字體:
供稿:網(wǎng)友

Map的種類

在Java中,Map的主要作用是存儲(chǔ)鍵值對。由于是根據(jù)鍵得到值,所以不允許鍵重復(fù)。它主要有如下幾個(gè)類別:

HashMap:

最常用的Map,它根據(jù)鍵的HashCode值存儲(chǔ)數(shù)據(jù),根據(jù)鍵可以直接獲取它的值,具有很快的訪問速度,遍歷時(shí),取得數(shù)據(jù)的順序是完全隨機(jī)的。HashMap最多只允許一條記錄的鍵為Null;允許多條記錄的值為Null;HashMap不支持線程的同步,即任一時(shí)刻可以有多個(gè)線程同時(shí)寫HashMap;可能會(huì)導(dǎo)致數(shù)據(jù)的不一致。如果需要同步,可以用Collections的synchronizedMap方法使HashMap具有同步的能力,或者使用ConcurrentHashMap。Hashtable與HashMap類似,它繼承自Dictionary類,不同的是:它不允許記錄的鍵或者值為空;它支持線程的同步,即任一時(shí)刻只有一個(gè)線程能寫Hashtable,因此也導(dǎo)致了 Hashtable在寫入時(shí)會(huì)比較慢。

LinkedHashMap

保存了記錄的插入順序,在用Iterator遍歷LinkedHashMap時(shí),先得到的記錄肯定是先插入的.也可以在構(gòu)造時(shí)用帶參數(shù),按照應(yīng)用次數(shù)排序。在遍歷的時(shí)候會(huì)比HashMap慢,不過有種情況例外,當(dāng)HashMap容量很大,實(shí)際數(shù)據(jù)較少時(shí),遍歷起來可能會(huì)比LinkedHashMap慢,因?yàn)長inkedHashMap的遍歷速度只和實(shí)際數(shù)據(jù)有關(guān),和容量無關(guān),而HashMap的遍歷速度和他的容量有關(guān)。

TreeMap

實(shí)現(xiàn)SortMap接口,能夠把它保存的記錄根據(jù)鍵排序,默認(rèn)是按鍵值的升序排序,也可以指定排序的比較器,當(dāng)用Iterator 遍歷TreeMap時(shí),得到的記錄是排過序的。

按鍵排序

從上面Map的種類介紹我們可以看出,TreeMap是自帶按鍵排序的功能的,只需要在創(chuàng)建的時(shí)候同時(shí)實(shí)現(xiàn)一個(gè)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; //倒序.這里說明一下,如果返回負(fù)值,則o1先輸出,反之則o2      }    });        //填充數(shù)據(jù)    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));    }}/* 結(jié)果如下:key=9977  value=80key=9684  value=7108key=9422  value=1706key=9264  value=1210key=9248  value=4758key=9024  value=7048key=8892  value=3124key=8879  value=6414key=8814  value=8171key=8728  value=1538key=8513  value=4956key=8462  value=5617key=8355  value=8912*/

從上面可以看出,按鍵排序是不難的,而安置排序就比較麻煩一些,需要將Map轉(zhuǎn)一下。

按值排序

由于Java中Map并沒有此功能,所以我們需要自己實(shí)現(xiàn)。思路如下:

Java中List是可以使用compare接口的。
Map實(shí)際上就是Entry<>的集合
那么使用List<Entry<>>就可以實(shí)現(xiàn)排序
將排好序的元素再插入到LinkedMap中

代碼實(shí)現(xiàn)如下:

 private static Map<Integer, Integer> sortMap(Map<Integer, Integer> linkedMap) {        List<Map.Entry<Integer, Integer>> cache = new ArrayList<>(linkedMap.entrySet());    //重寫比較函數(shù)    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<>();    //將結(jié)果插入LinkedMap然后返回    for(int i = 0; i < cache.size();i++){      resultMap.put(cache.get(i).getKey(), cache.get(i).getValue());    }    return resultMap;  }/*結(jié)果:7965  99661067  99631720  98333257  97383934  9578777  93481924  93153472  92703649  91145892  9078*/

這樣,按值排序和按鍵排序就都可以實(shí)現(xiàn)了。

發(fā)表評論 共有條評論
用戶名: 密碼:
驗(yàn)證碼: 匿名發(fā)表
主站蜘蛛池模板: 长春市| 通州市| 文水县| 开远市| 大丰市| 金川县| 达州市| 桓台县| 都昌县| 综艺| 惠来县| 绩溪县| 河西区| 广汉市| 牙克石市| 日喀则市| 沭阳县| 苍溪县| 瓮安县| 灵寿县| 哈尔滨市| 西林县| 华阴市| 阿坝县| 江门市| 南华县| 岗巴县| 兴海县| 景宁| 连江县| 孟津县| 靖安县| 高清| 奉节县| 枞阳县| 鸡西市| 江油市| 安康市| 彩票| 象山县| 泰和县|