Java SortedMap

更新于 2025-12-28

Jakob Jenkov 2019-10-17

Java 的 SortedMap 接口(java.util.SortedMap)是 java.util.Map 接口的子类型,其额外特性是:存储在 SortedMap 中的元素会按照内部顺序自动排序。这意味着你可以按照排序后的顺序遍历 SortedMap 中的元素。

TreeMap —— SortedMap 的实现类

Java 自带了一个实现了 SortedMap 接口的内置类:TreeMapjava.util.TreeMap)。

创建 TreeMap

你可以通过 TreeMap 的构造函数来实例化它。下面是一个创建 TreeMap 实例的例子:

SortedMap sortedMap = new TreeMap();

使用 Comparator 创建 TreeMap

你也可以将一个 Comparator 实现传给 TreeMap 的构造函数。该 Comparator 将用于对 SortedMap 中键值对的键进行排序。示例如下:

Comparator comparator = new MyComparatorImpl();
SortedMap sortedMap = new TreeMap(comparator);

排序规则

SortedMap 中元素的排序方式有两种:

  • 如果键实现了 java.lang.Comparable 接口,则使用其自然排序;
  • 或者使用你在创建 SortedMap 时传入的 Comparator 来确定顺序。

升序 vs 降序

默认情况下,元素以升序(从“最小”到“最大”)进行迭代。但你也可以通过 TreeMap.descendingKeySet() 方法以降序方式遍历元素。

遍历 SortedMap

遍历 SortedMap 的方式与普通 Map 相同。但由于 SortedMap 的键是有序的,通常你会希望按键的排序顺序进行遍历。可以通过调用 keySet() 方法来实现:

SortedMap sortedMap = new TreeMap();
sortedMap.put("a", "one");
sortedMap.put("b", "two");
sortedMap.put("c", "three");

Iterator iterator = sortedMap.keySet().iterator();
while(iterator.hasNext()) {
    String key = (String) iterator.next();
    String value = (String) sortedMap.get(key);
}

若要以降序遍历键,可使用 descendingKeySet() 方法:

Iterator iterator = sortedMap.descendingKeySet().iterator();
while(iterator.hasNext()) {
    String key = (String) iterator.next();
    String value = (String) sortedMap.get(key);
}

获取所使用的 Comparator

如果你的 SortedMap 是通过 Comparator 创建的,可以通过 comparator() 方法获取该 Comparator

Comparator comparator = sortedMap.comparator();

获取第一个键(最小键)

SortedMap 提供了 firstKey() 方法,用于快速获取键集中最小(第一个)的键:

String firstKey = (String) sortedMap.firstKey();

获取最后一个键(最大键)

同样地,lastKey() 方法用于获取键集中最大(最后一个)的键:

String lastKey = (String) sortedMap.lastKey();

获取头映射(Head Map)

headMap(K toKey) 方法返回一个新的 Map,包含原 SortedMap 中所有小于 toKey 的键值对(按排序顺序):

SortedMap sortedMap = new TreeMap();
sortedMap.put("a", "1");
sortedMap.put("c", "3");
sortedMap.put("e", "5");
sortedMap.put("d", "4");
sortedMap.put("b", "2");

SortedMap headMap = sortedMap.headMap("c");
System.out.println(headMap); // 输出: {a=1, b=2}

获取尾映射(Tail Map)

tailMap(K fromKey) 方法返回一个新 Map,包含所有大于或等于 fromKey 的键值对:

SortedMap tailMap = sortedMap.tailMap("c");
System.out.println(tailMap); // 输出: {c=3, d=4, e=5}

获取子映射(Submap)

subMap(K fromKey, K toKey) 方法返回一个子映射,包含键 fromKey 且 < toKey 的所有条目:

SortedMap subMap = sortedMap.subMap("b", "e");
System.out.println(subMap); // 输出: {b=2, c=3, d=4}

更多细节请查阅 JavaDoc

TreeMap 还提供了许多不属于 SortedMap 接口的功能(例如获取降序键集等)。建议查阅官方 JavaDoc 以了解全部特性。