日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程语言 > java >内容正文

java

Java 8 –按值对HashMap进行升序和降序排序

發布時間:2023/12/3 java 25 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Java 8 –按值对HashMap进行升序和降序排序 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

在上一篇文章中,我向您展示了如何通過鍵對Java 8中的Map進行排序 ,今天,我將教您如何使用Java 8功能(例如,lambda表達式,方法引用,流和新方法) 按值對Map進行排序。添加到java.util.Comparator和Map.Entry類中。 為了對任何Map進行排序,例如HashMap ,Hashtable,LinkedHashMap,TreemMap甚至ConcurrentHashMap ,您可以首先使用entrySet()方法獲取條目集,然后可以通過調用stream()方法獲取流。 entrySet()方法返回一個Set,該Set從java.util.Collection類繼承stream()方法。 一旦獲得流,就可以調用sorted()方法,該方法可以使用Comparator對Stream中可用的所有Map.Entry對象進行排序。

為了按值比較Map的條目,可以使用java.util.Map.Entry類中新添加的Map.Entry.comparingByValue()方法。

這與我們在上一篇文章中使用過的compareByKey()方法相對應。 這兩種方法都被重載以與Comparable和Comparator對象一起使用。

對流進行排序后,您可以執行任何操作,例如,如果您只想按排序的順序打印鍵,值或條目,則只需使用forEach()方法,或者如果要按值對Map進行排序,則可以您可以使用流類的collect()方法。

此方法接受收集器,并允許您將Stream的所有元素捕獲到所需的任何集合中。 例如,如果要排序的地圖,則可以使用java.util.stream.Collectors類的toMap()方法。

此方法是重載的,并提供了兩種選擇,例如,您可以收集任何類型的地圖中的條目,也可以指定所需的地圖類型,例如,為了使條目保持排序,我們將使用LinkedHashMap 。 它還允許您在相同值的情況下打破平局,例如,可以按想要的順序排列它們。

順便說一句,如果您好奇的話,您還可以查看Pluralsight的《 從Java 8使用Lambda表達式到從流到集合》課程,以了解有關特定于集合框架的Java 8新功能的更多信息。

簡而言之,以下是在Java 8中按值升序或降序對HashMap進行排序的確切步驟,假設您已經有一個map對象

  • 通過調用Map.entrySet()方法獲取條目集
  • 通過調用stream()方法獲取條目流
  • 用Comparator調用排序的方法
  • 使用Map.Entry.comparingByValue()比較器按值對條目進行排序
  • 使用collect()方法收集結果
  • 使用Collectors.toMap()方法在另一個Map中獲取結果。
  • 在最后一個參數中提供LinkedHashMap :: new,以強制其返回LinkedHashMap,以保留排序順序
  • 為了按降序排序,只需使用Java 8的Collections.reverseOrder()或Comparator.reverse()方法來顛倒Comparator的順序,有關添加到關鍵Java類中的新方法的完整列表,請參閱Java SE 8,對于Really Im耐心 。例如Java Collection Framework,String和Comparator等。
  • 完成此步驟后,您將獲得一個按值排序的Map。 現在您已經了解了理論和步驟,現在讓我們看下一節中的代碼示例以使其正確。

    Java程序按值對地圖排序

    這是我們完整的Java程序,使用Java 8功能按值對Map進行排序,例如,通過使用接口上的默認方法和靜態方法對Java 8中的現有類進行開發,從而對Java 8中現有類的新方法進行了排序。 在此示例中,我獲得了項目地圖及其費用(例如租金,公用事業,交通等)的Map。Map關鍵字是String ,代表項目,值是Integer,即費用。 我們的任務是按值對“地圖”進行排序,以找出哪個項目花費最多,并按值的降序打印所有項目。

    import java.util.Collections; import java.util.Comparator; import java.util.HashMap; import java.util.LinkedHashMap; import java.util.Map;import static java.util.stream.Collectors.*; import static java.util.Map.Entry.*;/** Java Program to sort a Map by values in Java 8* */ public class Main {public static void main(String[] args) throws Exception {// a Map with string keys and integer valuesMap<String, Integer> budget = new HashMap<>();budget.put("clothes", 120);budget.put("grocery", 150);budget.put("transportation", 100);budget.put("utility", 130);budget.put("rent", 1150);budget.put("miscellneous", 90);System.out.println("map before sorting: " + budget);// let's sort this map by values firstMap<String, Integer> sorted = budget.entrySet().stream().sorted(comparingByValue()).collect(toMap(e -> e.getKey(), e -> e.getValue(), (e1, e2) -> e2,LinkedHashMap::new));System.out.println("map after sorting by values: " + sorted);// above code can be cleaned a bit by using method referencesorted = budget.entrySet().stream().sorted(comparingByValue()).collect(toMap(Map.Entry::getKey, Map.Entry::getValue, (e1, e2) -> e2,LinkedHashMap::new));// now let's sort the map in decreasing order of valuesorted = budget.entrySet().stream().sorted(Collections.reverseOrder(Map.Entry.comparingByValue())).collect(toMap(Map.Entry::getKey, Map.Entry::getValue, (e1, e2) -> e2,LinkedHashMap::new));System.out.println("map after sorting by values in descending order: "+ sorted);}}Output map before sorting: {grocery=150, utility=130, miscellneous=90, rent=1150,clothes=120, transportation=100} map after sorting by values: {miscellneous=90, transportation=100,clothes=120, utility=130, grocery=150, rent=1150} map after sorting by values in descending order: {rent=1150, grocery=150,utility=130, clothes=120, transportation=100, miscellneous=90}

    您可以看到,在對地圖進行排序之前,按照值將其隨機排列,但是首先,我們對它們進行了按值的升序排序,然后對相同的Map進行了按值的降序排序,這就是為什么租金排在第一位的原因,它使我們付出了最高的代價。

    一些技巧

    1)使用靜態導入可以縮短代碼,可以靜態導入Map.Entry和Collectors類。

    2)盡可能使用方法引用代替lambda表達式。 請參閱本文章以了解更多有關如何lambda表達式轉換為方法的引用在Java中8,如果你不熟悉的。

    這就是如何在Java 8中按值對Map進行排序的全部內容。 您可以看到,使用添加到現有類的新方法對Map進行排序非常容易。 一切皆有可能,因為JDK 8的默認方法功能使您可以向現有類添加新方法。 在進行此增強之前,在Java中不破壞接口的現有客戶端是不可能的,因為一旦將新方法添加到接口中,它的所有客戶端都必須實現它。 如果方法是默認方法或靜態方法,則不再需要此方法,因為它們不是抽象方法而是具體方法。

    進一步閱讀

    Java 8的新增功能

    Java SE 8實在不耐煩

    使用Lambda表達式從Java 8中的集合到流

    相關的Java 8教程

    如果您有興趣學習有關Java 8的新功能的更多信息,這是我以前的文章,介紹Java 8的一些重要概念:

    • 從零開始學習Java 8的5本書( 書籍 )
    • Java 8中的默認方法是什么? ( 示例 )
    • 如何在Java 8中連接String( 示例 )
    • 如何在Java 8中使用filter()方法( 教程 )
    • 如何在Java 8中使用LocalDateTime格式化/解析日期? ( 教程 )
    • 如何在Java 8中使用Stream類( 教程 )
    • 如何在Java 8中將列表轉換為Map( 解決方案 )
    • Java 8中抽象類和接口之間的區別? ( 回答 )
    • Java 8中20個日期和時間的示例( 教程 )
    • 如何在Java 8中使用peek()方法( 示例 )
    • 如何在Java 8中按鍵對地圖排序? ( 示例 )
    • 如何在Java 8中按值對may進行排序? ( 示例 )
    • Java 8中的Optionals的10個示例? ( 示例 )

    感謝您到目前為止閱讀本文。 如果您喜歡這篇文章,請與您的朋友和同事分享。 如果您有任何疑問或建議,請發表評論。

    翻譯自: https://www.javacodegeeks.com/2017/09/java-8-sorting-hashmap-values-ascending-descending-order.html

    總結

    以上是生活随笔為你收集整理的Java 8 –按值对HashMap进行升序和降序排序的全部內容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。