Java 简明教程

Java - SortedMap Interface

SortedMap 接口扩展了 Map。它确保项按升序键顺序维护。

调用地图中没有项时,几个方法会引发 NoSuchElementException。当 object 与地图中的元素不兼容时,引发 ClassCastException。当尝试使用空对象而地图中不允许出现空值时,引发 NullPointerException。

SortedMap Interface Methods

SortedMap 声明的方法汇总在以下表格中 −

Sr.No.

Method & Description

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 的项。

Hierarchy of SortedMap Interface

下图显示了 Java 中 SortedMap 接口的层次结构 -

hierarchy diagram of sortedmap interface

Operations on SortedMap Interface

Creating a SortedMap

TreeMap class实现了 SortedMap 接口。我们可以使用 TreeMap 构造函数创建 SortedMap 实例。

以下是创建 sortemap 实例的语法:

// Create a sorted map
SortedMap<String, Double> map = new TreeMap<>();

在此,我们正在创建 String 与 Double 值的排序映射。此映射将根据字母数字顺序存储键。

Adding Value to a SortedMap

SortedMap 提供 put() 方法,可将其用于向排序映射实例添加值。每当向映射中添加值时,映射会根据输入的键自动对自己进行排序。

public V put(K key,V value)

其中,键值对表示彼此关联的键和值,并存储在映射中。如果此键已与某个值关联,则返回该值,并使用新值与该键关联;否则,返回一个 null 值。

// Put elements to the map
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));

Getting value from a SortedMap

使用 get(key) 方法,我们可以检索与某个键关联的值。

public V get(Object key)

如果该键在映射中不存在,则返回 null;否则,返回与所提供的键关联的值。

Double value = map.get("Qadir");
System.out.print("Qadir: " + value);

Updating value of a SortedMap

我们可以通过再次使用相同的键调用 put() 方法来更新已排序映射的现有值。作为已排序映射,根据新输入键(们) 的排序顺序,将再次对条目排序。

// Put elements to the map
map.put("Zara", Double.valueOf(3434.34));
map.put("Mahnaz", Double.valueOf(123.22));
map.put("Zara", Double.valueOf(1378.00));

SortedMap 将考虑最新的 put() 方法调用,以用具有相同键的条目更新条目。

Deleting a value from a sortedmap

使用 remove(key) 方法,我们可以移除与键关联的键和值。

public V remove(Object key)

如果该键在映射中不存在,则返回 null;否则,从映射中移除键值关联并相应地对映射进行排序。

Double value = map.remove("Qadir");
System.out.print("Qadir removed with value: " + value);

Iterating sortedMap

SortedMap 条目可以轻松进行导航。SortedMap 提供了一个 entrySet() 函数,它以集合的形式提供所有条目。

public Set<Map.Entry<K,V>> entrySet()

其中 Map.Entry 包含要迭代的键值对。

// Get a set of the entries
Set<Map.Entry<String, Double>> set = map.entrySet();

// Get an iterator
Iterator<Map.Entry<String, Double>> i = set.iterator();

// Display elements
while(i.hasNext()) {
 Map.Entry<String, Double> me = i.next();
 System.out.println(me.getKey());
}

Examples of SortedMap Interface

Example 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[]) {
      // Create a hash map
      SortedMap<String, Double> map = new TreeMap<>();

      // Put elements to the map
      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));

      // Get a set of the entries
      Set<Map.Entry<String, Double>> set = map.entrySet();

      // Get an iterator
      Iterator<Map.Entry<String, Double>> i = set.iterator();

      // Display elements
      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

Example 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[]) {
      // Create a hash map
      SortedMap<String, Double> map = new TreeMap<>();

      // Put elements to the map
      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));

      // Get a set of the entries
      Set<Map.Entry<String, Double>> set = map.entrySet();

      // Get an iterator
      Iterator<Map.Entry<String, Double>> i = set.iterator();

      // Display elements
      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

Example 3

以下是一个显示 TreeMap 如何用于获取分类映射项的键的示例 -

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[]) {
      // Create a hash map
      SortedMap<String, Double> map = new TreeMap<>();

      // Put elements to the map
      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));

      // Get a set of the entries
      Set<Map.Entry<String, Double>> set = map.entrySet();

      // Get an iterator
      Iterator<Map.Entry<String, Double>> i = set.iterator();

      // Display elements
      while(i.hasNext()) {
         Map.Entry<String, Double> me = i.next();
         System.out.println(me.getKey());
      }
   }
}
Ayan
Daisy
Mahnaz
Qadir
Zara

Advantages of SortedMap Interface

  1. SortedMap 确保映射始终按键的升序排序。每当将键值对添加到 sortedmap 中时,它都会重新排序

  2. 由于已排序,因此 sortedmap 在搜索中非常高效。对于大型只读数据集,sortedmap 是实施的理想选择。

  3. 我们可以使用键类型的比较器来自定义排序机制。

Disadvantages of SortedMap Interface

  1. 由于每次添加或更改条目时都必须对 sortedmap 进行排序,因此当更改非常频繁时,它将成为性能瓶颈。在这种情况下,sortedmap 不是首选。

  2. 由于 sortedMap 基于键保持可排序性,因此键应该是可比较的,因此如果键未实现可比较接口,则我们不能使用自定义键。