SortedMap
接口扩展了 Map
接口。它确保条目按照键的升序排列。
几个方法会在没有元素存在于调用映射时抛出 NoSuchElementException
。当一个对象与映射中的元素不兼容时,会抛出 ClassCastException
。如果尝试使用空对象而映射不允许空,则会抛出 NullPointerException
。
SortedMap 接口方法
SortedMap
接口中声明的方法总结如下:
序号 |
方法 & 描述 |
1 |
Comparator comparator() 返回调用排序映射的比较器。如果使用自然顺序,则返回 null 。 |
2 |
Object firstKey() 返回调用映射的第一个键。 |
3 |
SortedMap headMap(Object end) 返回一个排序映射,其中包含键小于 end 的映射条目。 |
4 |
Object lastKey() 返回调用映射的最后一个键。 |
5 |
SortedMap subMap(Object start, Object end) 返回一个映射,其中包含键大于或等于 start 且小于 end 的条目。 |
6 |
SortedMap tailMap(Object start) 返回一个映射,其中包含键大于或等于 start 的条目。 |
SortedMap 接口层次结构
下图显示了 Java 中 SortedMap
接口的层次结构:
SortedMap 接口上的操作
创建 SortedMap
TreeMap
类实现了 SortedMap
接口。我们可以使用 TreeMap
构造器来创建一个 SortedMap
实例。
语法:
SortedMap<String, Double> map = new TreeMap<>();
这里我们创建了一个 String
对 Double
值的排序映射。这个映射将基于字母数字顺序存储键。
向 SortedMap 添加值
SortedMap
提供了 put()
方法,可以用来向排序映射实例添加值。每当值被添加到映射中时,映射会自动根据输入的键进行排序。
语法:
public V put(K key, V value)
这里的键值对表示相互关联的键和值,并存储在映射中。如果此键已经与一个值相关联,则返回那个值,并且新的值与键相关联;否则返回 null
值。
从 SortedMap 获取值
使用 get(key)
方法,我们可以检索与键相关联的值。
语法:
public V get(Object key)
如果键不在映射中,则返回 null
;否则返回提供的键所关联的值。
更新 SortedMap 的值
我们可以通过再次调用带有相同键的 put()
方法来更新排序映射中现有的值。作为一个排序映射,在重新输入键之后,条目将再次根据排序顺序进行排序。
从排序映射删除值
使用 remove(key)
方法,我们可以删除与键相关联的值。
语法:
public V remove(Object key)
如果键不在映射中,则返回 null
;否则它将从映射中删除键值关联,并相应地对映射进行排序。
遍历 SortedMap
SortedMap
条目可以轻松导航。SortedMap
提供了一个 entrySet()
方法,该方法以集合的形式提供所有条目。
语法:
public Set<Map.Entry<K, V>> entrySet()
其中 Map.Entry
包含要迭代的键值对。
SortedMap 接口示例
示例 1
下面是一个示例,说明如何使用 TreeMap
获取 SortedMap
的值:
import java.util.Iterator;
import java.util.Map;
import java.util.Set;
import java.util.SortedMap;
import java.util.TreeMap;
public class MapDemo {
public static void main(String args[]) {
SortedMap<String, Double> map = new TreeMap<>();
map.put("Zara", Double.valueOf(3434.34));
map.put("Mahnaz", Double.valueOf(123.22));
map.put("Ayan", Double.valueOf(1378.00));
map.put("Daisy", Double.valueOf(99.22));
map.put("Qadir", Double.valueOf(-19.08));
Set<Map.Entry<String, Double>> set = map.entrySet();
Iterator<Map.Entry<String, Double>> i = set.iterator();
while (i.hasNext()) {
Map.Entry<String, Double> me = i.next();
System.out.print(me.getKey() + ": ");
System.out.println(me.getValue());
}
}
}
输出:
Ayan: 1378.0
Daisy: 99.22
Mahnaz: 123.22
Qadir: -19.08
Zara: 3434.34
示例 2
下面是一个示例,说明如何使用 TreeMap
设置 SortedMap
的值:
import java.util.Iterator;
import java.util.Map;
import java.util.Set;
import java.util.SortedMap;
import java.util.TreeMap;
public class MapDemo {
public static void main(String args[]) {
SortedMap<String, Double> map = new TreeMap<>();
map.put("Zara", Double.valueOf(3434.34));
map.put("Mahnaz", Double.valueOf(123.22));
map.put("Ayan", Double.valueOf(1378.00));
map.put("Daisy", Double.valueOf(99.22));
map.put("Qadir", Double.valueOf(-19.08));
Set<Map.Entry<String, Double>> set = map.entrySet();
Iterator<Map.Entry<String, Double>> i = set.iterator();
while (i.hasNext()) {
Map.Entry<String, Double> me = i.next();
me.setValue(me.getValue() * 10);
System.out.print(me.getKey() + ": ");
System.out.println(me.getValue());
}
}
}
输出:
Ayan: 13780.0
Daisy: 992.2
Mahnaz: 1232.2
Qadir: -190.79999999999998
Zara: 34343.4
示例 3
下面是一个示例,说明如何使用 TreeMap
获取 SortedMap
条目的键:
import java.util.Iterator;
import java.util.Map;
import java.util.Set;
import java.util.SortedMap;
import java.util.TreeMap;
public class MapDemo {
public static void main(String args[]) {
SortedMap<String, Double> map = new TreeMap<>();
map.put("Zara", Double.valueOf(3434.34));
map.put("Mahnaz", Double.valueOf(123.22));
map.put("Ayan", Double.valueOf(1378.00));
map.put("Daisy", Double.valueOf(99.22));
map.put("Qadir", Double.valueOf(-19.08));
Set<Map.Entry<String, Double>> set = map.entrySet();
Iterator<Map.Entry<String, Double>> i = set.iterator();
while (i.hasNext()) {
Map.Entry<String, Double> me = i.next();
System.out.println(me.getKey());
}
}
}
输出:
Ayan
Daisy
Mahnaz
Qadir
Zara
SortedMap 接口的优点
SortedMap
确保映射总是按照键的升序排列。每当键值对被添加到排序映射时,都会重新排序。 由于已排序,SortedMap
在搜索方面非常高效。对于大型只读数据集,SortedMap
是理想的实现选择。 我们可以使用键类型的比较器来自定义排序机制。
SortedMap 接口的缺点
由于 SortedMap
每次添加或更改条目时都必须排序,因此在频繁更改的情况下会成为性能瓶颈。在这种情况下,SortedMap
不被推荐。 由于 SortedMap
根据键维护可排序性,所以键应该可以比较,因此我们不能使用未实现 Comparable
接口的自定义键。