Java程式:按鍵值排序HashMap


在本文中,我們將學習在Java中按鍵和值排序HashMap的步驟,並檢查與每種技術相關的效能影響。HashMap是一個常用的資料結構,允許程式設計師儲存鍵值對。這種資料結構是一種極其有效的儲存資料的方法,並允許根據鍵快速檢索值。但是,有時可能需要按其鍵或值排列HashMap

排序HashMap的不同方法

以下是按鍵和值排序HashMap的不同方法:

按鍵排序HashMap

要在Java中根據其排列HashMap,可以使用TreeMap類。TreeMap是一個排序對映,它根據其自然順序或自定義Comparator以排序模式組織其條目。根據鍵排序HashMap涉及以下步驟:

  • 首先,我們將從java.util包匯入所有必要的類。
  • 我們將初始化一個HashMap並向其中新增鍵值對。
  • 顯示未排序的HashMap以顯示其初始順序。
  • 構造一個TreeMap例項並將原始HashMap傳遞給它。由於TreeMap會自動按鍵排序條目,因此HashMap條目現在將按鍵排序。
  • 顯示TreeMap以顯示按鍵排序的HashMap。
  • 使用foreach迴圈迭代TreeMap條目並列印按排序順序排列的每個鍵值對。

示例

import java.util.*;

public class SortHashMapByKey {
   public static void main(String[] args) {
      HashMap<String, Integer> map = new HashMap<>();
      map.put("John", 80);
      map.put("Alice", 70);
      map.put("Bob", 90);
      map.put("David", 75);
      
      System.out.println("HashMap before sorting: " + map);
      
      TreeMap<String, Integer> sortedMap = new TreeMap<>(map);
      System.out.println("HashMap after sorting by keys: " + sortedMap);
      
      for(Map.Entry<String, Integer> entry : sortedMap.entrySet()) {
         System.out.println(entry.getKey() + ": " + entry.getValue());
      }
   }
}

輸出

HashMap before sorting: {Alice=70, Bob=90, David=75, John=80}
HashMap after sorting by keys: {Alice=70, Bob=90, David=75, John=80}
Alice: 70
Bob: 90
David: 75
John: 80

按值排序HashMap

與按鍵排序相比,按其值排列HashMap是一個更復雜的過程。這是因為Java中沒有內建的技術可以按其值對HashMap進行排序。但是,我們可以透過使用Comparator和TreeMap來實現這一點:

  • 首先,我們將從java.util包匯入所有必要的類。
  • 初始化一個HashMap並新增鍵值對。
  • 建立一個Map.Entry物件列表以儲存來自HashMap的條目。
  • 我們將使用Collections.sort()和自定義Comparator根據每個條目的值對列表進行排序。
  • 我們將建立一個LinkedHashMap並將每個排序的條目插入其中以保持值的順序。
  • 列印LinkedHashMap,現在按值排序。

示例

import java.util.*;

public class SortHashMapByValue {
   public static void main(String[] args) {
      // create a HashMap to be sorted by values
      Map<String, Integer> unsortedMap = new HashMap<>();
      unsortedMap.put("A", 5);
      unsortedMap.put("B", 3);
      unsortedMap.put("C", 7);
      unsortedMap.put("D", 1);

      // create a List of Map Entries
      List<Map.Entry<String, Integer>> entryList = new ArrayList<>(unsortedMap.entrySet());

      // sort the List using a Comparator
      Collections.sort(entryList, new Comparator<Map.Entry<String, Integer>>() {
         @Override
         public int compare(Map.Entry<String, Integer> o1, Map.Entry<String, Integer> o2) {
         return o1.getValue().compareTo(o2.getValue());
         }
      });

      // insert the sorted entries into a TreeMap
      Map<String, Integer> sortedMap = new TreeMap<>();
      for (Map.Entry<String, Integer> entry : entryList) {
         sortedMap.put(entry.getKey(), entry.getValue());
      }

      // print the sorted Map
      System.out.println(sortedMap);
   }
}

輸出

{D=1, B=3, A=5, C=7}

時間複雜度:O(n log n)

效能比較:按鍵排序與按值排序

是否按鍵或值對HashMap進行排序取決於具體場景。按鍵排序通常比按值排序更快,因為它可以使用內建的TreeMap.sort()方法實現,該方法的時間複雜度為O(n log n)。相反,按值排序需要自定義Comparator和TreeMap,其時間複雜度更高,為O(n log n)。

結論

可以在Java中透過兩種不同的方式對HashMap進行排序:按鍵排序或按值排序。當HashMap中的鍵已知且唯一,並且排序基於值的重要性時,則優先選擇按鍵排序。另一方面,當排序主要基於值,而鍵的重要性為次要時,則優先選擇按值排序。

在Java的HashMap中按鍵排序是一個相當簡單的過程,可以使用內建的TreeMap.sort()方法來完成。相反,按值排序需要自定義Comparator和TreeMap。根據具體需求,任何一種方法都可能是首選。

更新於:2024年11月7日

573 次瀏覽

開啟你的職業生涯

完成課程獲得認證

開始學習
廣告