Java - SortedSet 接口
SortedSet 接口 扩展了 Set,并声明了一个按升序排序的集合的行为。除了 Set 定义的方法外,SortedSet 接口还声明了下表中总结的方法 —
当调用集合中不包含元素时,几个方法会抛出 NoSuchElementException。如果对象与集合中的元素不兼容,则会抛出 ClassCastException。
如果尝试使用 null 对象且集合不允许 null,则会抛出 NullPointerException。
SortedSet 接口方法
| 序号 | 方法 & 描述 |
|---|---|
| 1 | Comparator comparator( ) 返回调用 sorted set 的 comparator。如果该 set 使用自然排序,则返回 null。 |
| 2 | Object first( ) 返回调用 sorted set 中的第一个元素。 |
| 3 | SortedSet headSet(Object end) 返回一个 SortedSet,其中包含调用 sorted set 中小于 end 的元素。返回的 sorted set 中的元素也由调用 sorted set 引用。 |
| 4 | Object last( ) 返回调用 sorted set 中的最后一个元素。 |
| 5 | SortedSet subSet(Object start, Object end) 返回一个 SortedSet,其中包含 start 和 end 之间的元素。返回的集合中的元素也由调用对象引用。 |
| 6 | SortedSet tailSet(Object start) 返回一个 SortedSet,其中包含 sorted set 中大于或等于 start 的元素。返回的 set 中的元素也由调用对象引用。 |
SortedSet 接口的操作
创建 SortedSet
TreeSet 类实现了 SortedSet 接口。我们可以使用 TreeSet 构造函数来创建 SortedSet 实例。以下是创建 SortedSet 实例的语法:
语法
// 创建 sorted set SortedSet<String> set = new TreeSet<>();
这里我们创建了一个 String 值的 sorted set。该集合将存储唯一的字符串值。如果添加重复值,则将被丢弃。
向 SortedSet 添加值
SortedSet 提供了 add() 方法,可用于向 SortedSet 实例添加值。每当向集合添加值时,都会与现有值进行检查。如果集合被修改,则方法返回 true,否则返回 false。
语法
public boolean add(E e)
其中 E 表示要添加的元素。如果元素已存在,则不执行任何操作,方法返回 false。
示例
// 向集合添加元素
set.add("b");
set.add("c");
set.add("a");
从 SortedSet 获取值
为了从 SortedSet 获取值,我们需要使用 iterator() 方法从 SortedSet 获取 iterator 对象。一旦 iterator 对象可用,就可以用来检索 SortedSet 中的值。
示例
// 遍历集合中的元素
Iterator it = set.iterator();
while (it.hasNext()) {
// 获取元素
Object element = it.next();
System.out.println(element.toString());
}
从 SortedSet 删除值
使用 remove(value) 方法,可以轻松删除 SortedSet 中存储的值/对象。
语法
public boolean remove(Object value)
如果值不在集合中,则返回 false;否则删除该值并返回 true。
set.remove("a");
遍历 SortedSet
SortedSet 中的条目可以轻松导航。SortedSet 提供 iterator() 方法,该方法提供了一个 iterator 来导航集合的所有条目。
语法
public Iterator<E> iterator()
其中 E 是要遍历的对象类型。
示例
// 遍历集合中的元素
Iterator it = set.iterator();
while (it.hasNext()) {
// 获取元素
Object element = it.next();
System.out.println(element.toString());
}
SortedSet 接口示例
向 SortedSet 添加元素的示例
SortedSet 在诸如 TreeSet 等各种类中有其实现。以下是 TreeSet 类中带有 add 操作的示例 −
import java.util.Iterator;
import java.util.SortedSet;
import java.util.TreeSet;
public class SortedSetDemo {
public static void main(String[] args) {
// 创建 sorted set
SortedSet<String> set = new TreeSet<>();
// 向 set 中添加元素
set.add("b");
set.add("c");
set.add("a");
// 遍历 set 中的元素
Iterator it = set.iterator();
while (it.hasNext()) {
// 获取元素
Object element = it.next();
System.out.println(element.toString());
}
}
}
输出
a b c
从 SortedSet 中移除元素的示例
SortedSet 在诸如 TreeSet 等各种类中有其实现。以下是 TreeSet 类中带有 add 和 remove 操作的示例 −
import java.util.Iterator;
import java.util.SortedSet;
import java.util.TreeSet;
public class SortedSetDemo {
public static void main(String[] args) {
// 创建 sorted set
SortedSet<String> set = new TreeSet<>();
// 向 set 中添加元素
set.add("b");
set.add("c");
set.add("a");
set.add("d");
set.add("e");
set.add("f");
// 移除元素
set.remove("c");
set.remove("f");
// 遍历 set 中的元素
Iterator it = set.iterator();
while (it.hasNext()) {
// 获取元素
Object element = it.next();
System.out.println(element.toString());
}
}
}
输出
a b d e
清空 SortedSet 的示例
SortedSet 在诸如 TreeSet 等各种类中有其实现。以下是 TreeSet 类中带有 add 和 clear 操作的示例 −
import java.util.Iterator;
import java.util.SortedSet;
import java.util.TreeSet;
public class SortedSetDemo {
public static void main(String[] args) {
// 创建 sorted set
SortedSet<String> set = new TreeSet<>();
// 向 set 中添加元素
set.add("b");
set.add("c");
set.add("a");
set.add("d");
set.add("e");
set.add("f");
System.out.println(set);
// 移除所有元素
set.clear();
System.out.println(set);
}
}
输出
[a, b, c, d, e, f] []
SortedSet 接口的优势
- SortedSet 确保集合始终按值的升序排序。每当向 SortedSet 添加键值对时,它都会重新排序。
- 由于具有排序和唯一性,SortedSet 在搜索方面非常高效。
- 我们可以通过对值类型使用 comparator 来自定义排序机制。
SortedSet 接口的劣势
- 由于每次添加或更改条目时 SortedSet 实例都必须排序,因此在更改非常频繁的情况下会成为性能瓶颈。在这种情况下,不推荐使用 SortedSet。
- 由于 SortedSet 只维护唯一记录,因此在数据集中可能出现重复条目的情况下无法使用此集合。