HOWTO · Java
在 Java 中建立有序對映
本文介紹如何在 Java 中建立有序對映。
本頁內容
對映是 Java 中儲存鍵值對的資料結構。對映是存在於 Collection 層次結構中的 interface。這些鍵是唯一的,因此不允許重複鍵;但是,對映到鍵的變數可以有重複的值。HashMap、LinkedHashMap 和 TreeMap 等類實現了 Map 介面。
使用 Java 中的 TreeMap 類對對映進行排序
下面,該程式演示了 Java 程式中的對映排序。
import java.util.TreeMap;
public class Main {
public static void main(String[] args) {
TreeMap<String, Integer> map = new TreeMap<String, Integer>();
map.put("Third", 1);
map.put("First", 2);
map.put("Second", 3);
for (String key : map.keySet()) {
System.out.println(key + " ,ID = " + map.get(key));
}
}
}
TreeMap 類按升序對對映值進行排序。它還在內部實現了 SortedMap 介面,因此使用 new 關鍵字建立對映例項。
樹圖中的資料型別在例項化時指定。Map 鍵是 String 型別,它的值是 Integer 型別。
put 函式在樹圖中插入鍵值對。現在,定義了一個 for-each 迴圈來遍歷對映。在 Java 中,無法直接迭代對映。因此,對映的鍵最初被轉換為 Set 例項。
map.keySet 函式返回對映中存在的鍵的 Set。此函式位於 TreeMap 類中,並返回當前鍵的有序檢視。get 函式獲取與鍵對應的值。
下面是按升序排列的輸出。
First, ID = 2 Second, ID = 3 Third, ID = 1
使用 Java 8 函式建立對映排序
Java 8 提供對函數語言程式設計的支援,允許使用者在函式鏈上工作。
Streams 是 java.util 包中的一個介面,它可以輕鬆地在單個語句中處理順序操作。Streams 函式在發射器發射資料的管道中工作;它會根據使用者的需求進行過濾、處理、轉換等等。
package F09;
import static java.util.AbstractMap.SimpleEntry;
import java.util.LinkedHashMap;
import java.util.Map;
import java.util.stream.Collectors;
import java.util.stream.Stream;
public class MapOrdering {
public static void main(String[] args) {
Map<String, String> mapSortedByKey =
Stream
.of(new SimpleEntry<>("key3", "value1"), new SimpleEntry<>("key1", "value2"),
new SimpleEntry<>("key2", "value3"))
.sorted(Map.Entry.comparingByKey())
.collect(Collectors.toMap(Map.Entry::getKey, Map.Entry::getValue,
(oldVal, newValue) -> oldVal, LinkedHashMap::new));
System.out.println();
System.out.print("Ordered List: ");
for (String s1 : mapSortedByKey.keySet()) {
System.out.print(" " + s1);
}
}
}
Stream 介面提供各種函式,並在不同的類中實現它以處理它們。在這裡,鍵值對流是使用 new SimpleEntry 類形成的。這些值被插入到 of 函式中以形成一個流。
在鏈系列中,sorted 函式被呼叫。該函式採用 Comparator 例項,根據定義的順序按順序排列鍵。函式 comparingByKey 返回按自然升序比較鍵的比較器。
sorted 函式最終返回按升序排列的值流。Stream 類的 collect 函式在新的 LinkedHashMap 例項中收集給定的對映值。該類保留所提供序列的插入順序。該函式將 Collector 例項作為引數。
第一個引數是建立新容器的供應商 toMap 函式。第二個引數是累積值的 BiConsumer,最後一個引數是充當合併結果的組合器的 BiConsumer。因此,LinkedHashMap::new 命令組合結果並返回形成的例項。
mapSortedByKey 例項現在包含使用上面的 for-each 迴圈迭代的順序對映元素。結果對映鍵列印在下面的標準輸出中。
Ordered List : key1 key2 key3