Java中的SortedSet接口及其示例

Java中的SortedSet接口及其示例

Java 中的 SortedSet 接口继承了 Set 接口,并提供了一些额外的有序性质,其中的元素按照一个特定的顺序排列,而不是以随机的顺序排列。在本篇文章中,我们将学习 SortedSet 的基本概念、方法和示例。

什么是SortedSet?

SortedSet 接口是一个有序的集合,其中的元素按照一个特定的顺序排列。与 Set 接口不同的是,SortedSet 接口不允许出现重复的元素。它提供了许多有关有序集合的额外功能,如根据元素顺序查找下/上界元素。

SortedSet 包含以下主要接口:NavigableSetSubSetHeadSetTailSet

SortedSet 接口的具体实现有 TreeSetConcurrentSkipListSet

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):返回从 fromElementtoElement 间的元素组成的子 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 接口中的所有方法,并提供了额外的能力,例如找到接近给定元素的值或获取一个子集。 TreeSetConcurrentSkipListSetSorted Set 接口的两个主要实现。 通过本文,我们了解了如何创建 SortedSet,如何对其内容进行排序以及如何使用 SortedSet 的方法。

Camera课程

Python教程

Java教程

Web教程

数据库教程

图形图像教程

办公软件教程

Linux教程

计算机教程

大数据教程

开发工具教程