Java SortedMap接口及实例
SortedMap是集合框架中的一个接口。这个接口扩展了Map接口,并提供了其元素的总排序(元素可以按照键的排序顺序进行遍历)。实现这个接口的类是TreeMap。
SortedMap的主要特点是它按键的自然排序,或按指定的比较器排序。因此,当你想要一个满足以下条件的地图时,可以考虑使用TreeMap。
- 不允许出现空键或空值。
- 键是按自然排序或按指定的比较器排序的。
类型参数
- K – 这个地图所维护的键的类型
- V – 映射的值的类型
SortedMap的父接口是Map<K, V>。
SortedMap的子接口是ConcurrentNavigableMap<K, V>, NavigableMap<K, V>。
SortedMap是由ConcurrentSkipListMap, TreeMap实现的。
声明
public interface SortedMap<K, V> extends Map<K, V>
{
Comparator comparator();
SortedMap subMap(K fromKey, K toKey);
SortedMap headMap(K toKey);
SortedMap tailMap(K fromKey);
K firstKey();
K lastKey();
}
例子
// Java code to demonstrate SortedMap Interface
import java.util.Iterator;
import java.util.Map;
import java.util.Set;
import java.util.SortedMap;
import java.util.TreeMap;
public class SortedMapExample {
public static void main(String[] args)
{
SortedMap<Integer, String> sm
= new TreeMap<Integer, String>();
sm.put(new Integer(2), "practice");
sm.put(new Integer(3), "quiz");
sm.put(new Integer(5), "code");
sm.put(new Integer(4), "contribute");
sm.put(new Integer(1), "geeksforgeeks");
Set s = sm.entrySet();
// Using iterator in SortedMap
Iterator i = s.iterator();
// Traversing map. Note that the traversal
// produced sorted (by keys) output .
while (i.hasNext()) {
Map.Entry m = (Map.Entry)i.next();
int key = (Integer)m.getKey();
String value = (String)m.getValue();
System.out.println("Key : " + key
+ " value : " + value);
}
}
}
输出:
Key : 1 value : geeksforgeeks
Key : 2 value : practice
Key : 3 value : quiz
Key : 4 value : contribute
Key : 5 value : code
创建SortedMap对象
由于SortedMap是一个接口,所以不能创建SortedMap类型的对象。我们总是需要一个扩展这个列表的类来创建一个对象。而且,在Java 1.5中引入泛型后,还可以限制可以存储在SortedMap中的对象的类型。这个类型安全的地图可以定义为。
// Obj1, Obj2是要存储在SortedMap中的对象的类型
SortedMap<Obj1, Obj2> set = new TreeMap<Obj1, Obj2> ();
在SortedMap上执行各种操作
由于SortedMap是一个接口,它只能与实现该接口的类一起使用。 TreeMap 就是实现SortedMap接口的类。现在,让我们看看如何在TreeMap上执行几个常用的操作。
1.添加元素: 为了向SortedMap添加一个元素,我们可以使用 put() 方法。但是,在TreeMap中不保留插入顺序。在内部,对于每一个元素,键都是按照升序进行比较和排序的。
// Java program add the elements in the SortedMap
import java.io.*;
import java.util.*;
class GFG {
// Main Method
public static void main(String args[])
{
// Default Initialization of a
// SortedMap
SortedMap tm1 = new TreeMap();
// Initialization of a SortedMap
// using Generics
SortedMap<Integer, String> tm2
= new TreeMap<Integer, String>();
// Inserting the Elements
tm1.put(3, "Geeks");
tm1.put(2, "For");
tm1.put(1, "Geeks");
tm2.put(new Integer(3), "Geeks");
tm2.put(new Integer(2), "For");
tm2.put(new Integer(1), "Geeks");
System.out.println(tm1);
System.out.println(tm2);
}
}
输出
{1=Geeks, 2=For, 3=Geeks}
{1=Geeks, 2=For, 3=Geeks}
2.改变元素: 在添加元素后,如果我们想改变元素,可以通过put()方法再次添加元素来完成。由于SortedMap中的元素是用键来索引的,所以键的值可以通过简单地插入我们想改变的键的更新值来改变。
// Java program to change
// the elements in SortedMap
import java.io.*;
import java.util.*;
class GFG {
// Main Method
public static void main(String args[])
{
// Initialization of a SortedMap
// using Generics
SortedMap<Integer, String> tm
= new TreeMap<Integer, String>();
// Inserting the Elements
tm.put(3, "Geeks");
tm.put(2, "Geeks");
tm.put(1, "Geeks");
System.out.println(tm);
tm.put(2, "For");
System.out.println(tm);
}
}
输出
{1=Geeks, 2=Geeks, 3=Geeks}
{1=Geeks, 2=For, 3=Geeks}
3.删除元素: 为了从SortedMap中删除一个元素,我们可以使用 remove() 方法。该方法接收键值,如果该键存在于地图中,则从该SortedMap中删除该键的映射。
// Java program to remove the
// elements from SortedMap
import java.io.*;
import java.util.*;
class GFG {
// Main Method
public static void main(String args[])
{
// Initialization of a SortedMap
// using Generics
SortedMap<Integer, String> tm
= new TreeMap<Integer, String>();
// Inserting the Elements
tm.put(3, "Geeks");
tm.put(2, "Geeks");
tm.put(1, "Geeks");
tm.put(4, "For");
System.out.println(tm);
tm.remove(4);
System.out.println(tm);
}
}
输出
{1=Geeks, 2=Geeks, 3=Geeks, 4=For}
{1=Geeks, 2=Geeks, 3=Geeks}
4.迭代排序后的Map: 有多种方法可以迭代Map。最著名的方法是使用一个增强的for循环并获得键。通过使用getValue()方法可以找到键的值。
// Java program to iterate through SortedMap
import java.util.*;
class GFG {
// Main Method
public static void main(String args[])
{
// Initialization of a SortedMap
// using Generics
SortedMap<Integer, String> tm
= new TreeMap<Integer, String>();
// Inserting the Elements
tm.put(3, "Geeks");
tm.put(2, "For");
tm.put(1, "Geeks");
for (Map.Entry mapElement : tm.entrySet()) {
int key = (int)mapElement.getKey();
// Finding the value
String value = (String)mapElement.getValue();
System.out.println(key + " : " + value);
}
}
}
输出
1 : Geeks
2 : For
3 : Geeks
实现SortedMap接口的类是TreeMap 。
在集合框架中实现的TreeMap类是对SortedMap接口的实现,SortedMap扩展了Map接口。它的行为就像一个简单的地图,不同的是它以排序的方式存储键。TreeMap使用树形数据结构进行存储。对象以排序、升序的方式存储。但我们也可以通过传递一个比较器来以降序存储。让我们看看如何使用这个类来创建一个排序的Map对象。
// Java program to demonstrate the
// creation of SortedMap object using
// the TreeMap class
import java.util.*;
class GFG {
public static void main(String[] args)
{
SortedMap<String, String> tm
= new TreeMap<String, String>(new Comparator<String>() {
public int compare(String a, String b)
{
return b.compareTo(a);
}
});
// Adding elements into the TreeMap
// using put()
tm.put("India", "1");
tm.put("Australia", "2");
tm.put("South Africa", "3");
// Displaying the TreeMap
System.out.println(tm);
// Removing items from TreeMap
// using remove()
tm.remove("Australia");
System.out.println("Map after removing "
+ "Australia:" + tm);
}
}
输出
{South Africa=3, India=1, Australia=2}
Map after removing Australia:{South Africa=3, India=1}
SortedMap接口的方法
方法 | 描述 |
---|---|
comparator() | 返回用于对该地图中的键进行排序的比较器,如果该地图使用其键的自然排序,则返回空。 |
entrySet() | 返回该地图中包含的映射的Set视图。 |
firstKey() | 返回当前该地图中的第一个(最低)键。 |
headMap(K toKey) | 返回此地图中键值严格小于toKey的部分的视图。 |
keySet() | 返回该地图中包含的键的Set视图。 |
lastKey() | 返回当前该地图中的最后一个(最高)键。 |
subMap(K fromKey, K toKey) | 返回该地图中键值范围从fromKey(包括)到toKey(不包括)的部分的视图。 |
tailMap(K fromKey) | 返回该地图中键值大于或等于fromKey的部分的视图。 |
values() | 返回该地图中包含的值的集合视图。 |
从java.util.Map接口继承的方法
方法 | 描述 |
---|---|
clear() | 该方法用于清除和删除指定的Map集合中的所有元素或映射。 |
containsKey(Object) | 这个方法用来检查一个特定的键是否被映射到地图中。 它以键元素为参数,如果该元素在地图中被映射,则返回True。 |
containsValue(Object) | 该方法用于检查一个特定的值是否被地图中的一个或多个键所映射。 它以值为参数,如果该值被地图中的任何一个键所映射,则返回True。 |
entrySet() | 该方法用于创建一个由地图中包含的相同元素组成的集合。它基本上返回一个地图的集合视图,或者我们可以创建一个新的集合并将地图元素存储到其中。 |
equals(Object) | 这个方法用于检查两个地图之间是否相等。它验证作为参数传递的一个地图的元素是否与这个地图的元素相等。 |
get(Object) | 该方法用于检索或获取由参数中提到的特定键映射的值。当地图不包含该键的映射时,它返回NULL。 |
hashCode() | 该方法用于为包含键和值的给定地图生成一个hashCode。 |
isEmpty() | 这个方法用来检查一个地图是否有任何关于键和值对的条目。如果没有映射存在,那么该方法返回true。 |
keySet() | 该方法用于返回该地图中包含的键的Set视图。这个集合是由地图支持的,所以地图的变化会反映在这个集合中,反之亦然。 |
put(Object, Object) | 这个方法用来把指定的值和这个地图中指定的键联系起来。 |
putAll(Map) | 该方法用于将指定地图中的所有映射复制到该地图中。 |
remove(Object) | 如果地图中存在某个键的映射,该方法用于从该地图中删除该键的映射。 |
size() | 该方法用于返回地图中可用的键/值对的数量。 |
values() | 这个方法用来从地图的值中创建一个集合。它基本上返回HashMap中数值的一个集合视图。 |