Java中的SortedMap接口及示例
SortedMap接口
SortedMap接口是Java中提供的一种特殊的Map类型,它继承自Map接口,并添加了新的操作方法,可以根据键值按自然顺序或自定义排序方式对Map进行操作,保证Map中所有键值对的有序性。SortedMap接口具有以下特点:
- 键值对按特定序列排列,排序时会根据键的自然次序(例如:String类型的键会按字母顺序排序)或自定义比较器所定义的顺序,而不是插入的顺序。
- 提供了访问第一个和最后一个键值对的方法。
- 提供了子Map方法,用于截取某个范围内的键值对。
- 所有实现SortedMap的类都必须实现Comparable接口或提供Comparator子类来定义键的排序方式。
排序方式
SortedMap接口的键值对的排序方式分为两种:
- 自然排序。如果键实现了Comparable接口,则按照键的自然排序方式进行排序。
- 定制排序。如果键没有实现Comparable接口,或者需要使用一种非自然排序方式,则需要提供一个Comparator子类定义排序方式。
以下是一个自然排序的示例代码:
import java.util.SortedMap;
import java.util.TreeMap;
class SortedMapDemo {
public static void main(String[] args) {
SortedMap<String, Integer> map = new TreeMap<>();
map.put("apple", 10);
map.put("banana", 20);
map.put("peach", 30);
map.put("orange", 40);
map.put("kiwi", 50);
System.out.println(map);
}
}
输出结果为:
{apple=10, banana=20, kiwi=50, orange=40, peach=30}
以下是一个定制排序的示例代码:
import java.util.Comparator;
import java.util.SortedMap;
import java.util.TreeMap;
class SortedMapDemo {
public static void main(String[] args) {
Comparator<String> cmp = (a, b) -> b.compareTo(a);
SortedMap<String, Integer> map = new TreeMap<>(cmp);
map.put("apple", 10);
map.put("banana", 20);
map.put("peach", 30);
map.put("orange", 40);
map.put("kiwi", 50);
System.out.println(map);
}
}
输出结果为:
{peach=30, orange=40, kiwi=50, banana=20, apple=10}
操作方法
SortedMap接口提供了一些特殊的操作方法,以下是常用的方法:
firstKey和lastKey
firstKey方法用于返回有序Map中第一个(最小)键对应的值,lastKey方法用于返回有序Map中最后一个(最大)键对应的值。
示例代码:
import java.util.SortedMap;
import java.util.TreeMap;
class SortedMapDemo {
public static void main(String[] args) {
SortedMap<String, Integer> map = new TreeMap<>();
map.put("apple", 10);
map.put("banana", 20);
map.put("peach", 30);
map.put("orange", 40);
map.put("kiwi", 50);
System.out.println(map.firstKey()); // 输出 apple
System.out.println(map.lastKey()); // 输出 kiwi
}
}
subMap
subMap方法用于从有序Map中截取出一个子Map,包含指定范围内的键值对。方法有两个参数,分别是起始键和截止键,包含起始键对应的值但不包含截止键对应的值。如果不指定截止键,则截取从起始键(包含)到有序Map中最后一个键对应的值。
示例代码:
import java.util.SortedMap;
import java.util.TreeMap;
class SortedMapDemo {
public static void main(String[] args) {
SortedMap<String, Integer> map = newTreeMap<>();
map.put("apple", 10);
map.put("banana", 20);
map.put("peach", 30);
map.put("orange", 40);
map.put("kiwi", 50);
SortedMap<String, Integer> subMap = map.subMap("banana", "orange");
System.out.println(subMap); // 输出 {banana=20, kiwi=50, orange=40}
}
}
注意,subMap方法返回的子Map是原始Map的视图,对子Map的修改会影响原始Map。
实现类
Java中提供了两个实现了SortedMap接口的常用类:
- TreeMap:基于红黑树实现,具有O(log n)的时间复杂度。
- ConcurrentSkipListMap:基于跳表实现,具有同步和并发安全性。
以下是TreeMap的示例代码:
import java.util.SortedMap;
import java.util.TreeMap;
class SortedMapDemo {
public static void main(String[] args) {
SortedMap<String, Integer> map = new TreeMap<>();
map.put("apple", 10);
map.put("banana", 20);
map.put("peach", 30);
map.put("orange", 40);
map.put("kiwi", 50);
System.out.println(map);
}
}
输出结果为:
{apple=10, banana=20, kiwi=50, orange=40, peach=30}
总结
当需要对Map中的键值对进行排序时,可以使用SortedMap接口和它的实现类TreeMap和ConcurrentSkipListMap。其中,TreeMap基于红黑树实现,可以在O(log n)的时间内对键值对进行增删改查和排序操作。SortedMap接口提供了访问第一个和最后一个键值对,以及截取子Map的操作方法。通过Comparator子类可以实现定制排序。