Java中的SortedSet接口及其示例
Java 中的 SortedSet
接口继承了 Set
接口,并提供了一些额外的有序性质,其中的元素按照一个特定的顺序排列,而不是以随机的顺序排列。在本篇文章中,我们将学习 SortedSet 的基本概念、方法和示例。
什么是SortedSet?
SortedSet
接口是一个有序的集合,其中的元素按照一个特定的顺序排列。与 Set
接口不同的是,SortedSet
接口不允许出现重复的元素。它提供了许多有关有序集合的额外功能,如根据元素顺序查找下/上界元素。
SortedSet 包含以下主要接口:NavigableSet
、SubSet
、HeadSet
和 TailSet
。
SortedSet 接口的具体实现有 TreeSet
和 ConcurrentSkipListSet
。
SortedSet的基本用法
创建SortedSet
要创建 SortedSet
,你需要使用其实现之一,并使用如下代码创建适当类型的对象:
// 创建 TreeSet
SortedSet<String> set = new TreeSet<String>();
// 创建 ConcurrentSkipListSet
SortedSet<String> set = new ConcurrentSkipListSet<String>();
当然,你也可以使用不同类型的数据类型来创建不同类型的 SortedSet
。
排序
与 SortedSet
相关的一切都与排序相关。 元素的排序始终在集合的基础上进行,采用自然排序/自定义排序。
自然排序
默认情况下,按照元素类型的自然顺序进行排序。例如,如果你声明了一个 SortedSet
类型的 String
,则就会按照字典顺序进行排序。
示例代码:
SortedSet<String> set = new TreeSet<String>();
set.add("Python");
set.add("Java");
set.add("Scala");
System.out.println(set); // [Java, Python, Scala]
自定义排序
有时,我们需要根据我们自己定义的规则,进行排序。可以通过实现一个比较器来完成自定义排序。
示例代码:
SortedSet<Employee> employees = new TreeSet<Employee>(new EmployeeComparator());
employees.add(new Employee(2, "John", "Doe"));
employees.add(new Employee(1, "Jane", "Doe"));
employees.add(new Employee(3, "Alice", "Green"));
System.out.println(employees);
class Employee {
private int id;
private String firstname;
private String lastname;
//getters and setters omitted
public Employee(int id, String firstname, String lastname) {
this.id = id;
this.firstname = firstname;
this.lastname = lastname;
}
@Override
public String toString() {
return id + ": " + firstname + ' ' + lastname;
}
}
class EmployeeComparator implements Comparator<Employee> {
@Override
public int compare(Employee o1, Employee o2) {
return o1.getId() - o2.getId();
}
}
输出结果:
[1: Jane Doe, 2: John Doe, 3: Alice Green]
SortedSet的方法
下面是 SortedSet 接口中一些主要方法:
Comparator<? super E> comparator()
:返回使用的比较器,如果 SortedSet 是使用自然顺序,返回null
。E first()
:返回排序后集合中的第一个元素。E last()
:返回排序后集合中的最后一个元素。SortedSet<E> subSet(E fromElement, E toElement)
:返回从fromElement
到toElement
间的元素组成的子 set。SortedSet<E> headSet(E toElement)
:返回比toElement
元素小的元素组成的子 set。SortedSet<E> tailSet(E fromElement)
:返回比fromElement
元素大的元素组成的子 set。E lower(E e)
:返回比给定元素小的最大元素,如果没有,则返回null
。E floor(E e)
:返回比给定元素小或等于的元素中的最大元素,如果没有,则返回null
。E ceiling(E e)
:返回比给定元素大或等于的元素中的最小元素,如果没有,则返回null
。E higher(E e)
:返回比给定元素大的最小元素,如果没有,则返回null
。
示例代码:
SortedSet<Integer> set = new TreeSet<Integer>();
set.add(2);
set.add(4);
set.add(6);
set.add(8);
set.add(10);
System.out.println("Set: " + set);
System.out.println("First element: " + set.first());
System.out.println("Last element: " + set.last());
SortedSet<Integer> subSet = set.subSet(4, 8);
System.out.println("Subset of set between 4 and 8 (exclusive): " + subSet);
SortedSet<Integer> tailSet = set.tailSet(6);
System.out.println("Tail set of set starting from 6: " + tailSet);
Integer lower = set.lower(6);
Integer floor = set.floor(6);
Integer ceiling = set.ceiling(6);
Integer higher = set.higher(6);
System.out.println("Lower than 6: " + lower);
System.out.println("Floor of 6: " + floor);
System.out.println("Ceiling of 6: " + ceiling);
System.out.println("Higher than 6: " + higher);
输出结果:
Set: [2, 4, 6, 8, 10]
First element: 2
Last element: 10
Subset of set between 4 and 8 (exclusive): [4, 6]
Tail set of set starting from 6: [6, 8, 10]
Lower than 6: 4
Floor of 6: 6
Ceiling of 6: 6
Higher than 6: 8
结论
在 Java 中,SortedSet
接口提供了一个按特定顺序(自然/自定义)排序的有序集合。由于是基于 Set
接口的,因此它具有 Set
接口中的所有方法,并提供了额外的能力,例如找到接近给定元素的值或获取一个子集。 TreeSet
和 ConcurrentSkipListSet
是 Sorted Set
接口的两个主要实现。 通过本文,我们了解了如何创建 SortedSet
,如何对其内容进行排序以及如何使用 SortedSet
的方法。