Jakob Jenkov 2019-10-17
Java 的 SortedMap 接口(java.util.SortedMap)是 java.util.Map 接口的子类型,其额外特性是:存储在 SortedMap 中的元素会按照内部顺序自动排序。这意味着你可以按照排序后的顺序遍历 SortedMap 中的元素。
TreeMap —— SortedMap 的实现类
Java 自带了一个实现了 SortedMap 接口的内置类:TreeMap(java.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 以了解全部特性。