欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

Java中Map的排序問(wèn)題詳解

 更新時(shí)間:2016年01月30日 13:19:57   投稿:hebedich  
本文給大家分享的是java中的map的按值排序和按鍵排序問(wèn)題,并通過(guò)具體的示例,希望對(duì)大家能有所幫助。

Map的種類(lèi)

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

HashMap:

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

LinkedHashMap

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

TreeMap

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

按鍵排序

從上面Map的種類(lèi)介紹我們可以看出,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; //倒序.這里說(shuō)明一下,如果返回負(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=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轉(zhuǎn)一下。

按值排序

由于Java中Map并沒(méi)有此功能,所以我們需要自己實(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());

    //重寫(xiě)比較函數(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  9966
1067  9963
1720  9833
3257  9738
3934  9578
777  9348
1924  9315
3472  9270
3649  9114
5892  9078
*/

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

相關(guān)文章

  • Mybatis分解式查詢(xún)使用方法

    Mybatis分解式查詢(xún)使用方法

    這篇文章主要介紹了Mybatis分解式查詢(xún)使用方法,分解式查詢(xún)就是將一條Sql語(yǔ)句拆分成多條。在 MyBatis 多表查詢(xún)中,使用連接查詢(xún)時(shí)一個(gè) Sql 語(yǔ)句就可以查詢(xún)出所有的數(shù)據(jù)
    2023-04-04
  • Spring集成Druid連接池及監(jiān)控配置的全過(guò)程

    Spring集成Druid連接池及監(jiān)控配置的全過(guò)程

    java程序很大一部分要操作數(shù)據(jù)庫(kù),為了提高性能操作數(shù)據(jù)庫(kù)的時(shí)候,有不得不使用數(shù)據(jù)庫(kù)連接池,下面這篇文章主要給大家介紹了關(guān)于Spring集成Druid連接池及監(jiān)控配置的相關(guān)資料,需要的朋友可以參考下
    2021-09-09
  • Java中RedissonClient基本使用指南

    Java中RedissonClient基本使用指南

    RedissonClient 是一個(gè)強(qiáng)大的 Redis 客戶(hù)端,提供了豐富的功能和簡(jiǎn)單的 API,本文就來(lái)介紹一下Java中RedissonClient基本使用指南,具有一定的參考價(jià)值,感興趣的可以了解一下
    2024-03-03
  • spring boot整合redis主從sentinel方式

    spring boot整合redis主從sentinel方式

    這篇文章主要介紹了spring boot整合redis主從sentinel方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2022-03-03
  • java  自定義注解的實(shí)例詳解

    java 自定義注解的實(shí)例詳解

    這篇文章主要介紹了java 自定義注解的實(shí)例詳解的相關(guān)資料,需要的朋友可以參考下
    2017-09-09
  • 類(lèi)添加注解@RequestMapping報(bào)錯(cuò)HTTP Status 404的解決

    類(lèi)添加注解@RequestMapping報(bào)錯(cuò)HTTP Status 404的解決

    這篇文章主要介紹了類(lèi)添加注解@RequestMapping報(bào)錯(cuò)HTTP Status 404的解決,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2021-08-08
  • JUC系列學(xué)習(xí)工具類(lèi)CountDownLatch詳解

    JUC系列學(xué)習(xí)工具類(lèi)CountDownLatch詳解

    這篇文章主要介紹了JUC系列學(xué)習(xí)工具類(lèi)CountDownLatch詳解,文章圍繞主題展開(kāi)詳細(xì)的內(nèi)容介紹,具有一定的參考價(jià)值,需要的小伙伴可任意參考一下
    2022-08-08
  • 詳解Java類(lèi)動(dòng)態(tài)加載和熱替換

    詳解Java類(lèi)動(dòng)態(tài)加載和熱替換

    本文主要介紹類(lèi)加載器、自定義類(lèi)加載器及類(lèi)的加載和卸載等內(nèi)容,并舉例介紹了Java類(lèi)的熱替換。
    2021-05-05
  • OpenCV實(shí)現(xiàn)反閾值二值化

    OpenCV實(shí)現(xiàn)反閾值二值化

    這篇文章主要為大家詳細(xì)介紹了OpenCV實(shí)現(xiàn)反閾值二值化,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2021-11-11
  • SpringMVC+MyBatis分頁(yè)(最新)

    SpringMVC+MyBatis分頁(yè)(最新)

    本篇文章主要介紹了SpringMVC+MyBatis分頁(yè),具有一定的參考價(jià)值,有興趣的可以了解一下。
    2016-12-12

最新評(píng)論