Java 中排序 Set

2025年9月2日 | 阅读 5 分钟

Java 的 Set 接口(Java 集合框架的一部分)代表了一个不允许重复元素的集合。当需要保持元素的唯一性时,它经常被使用。然而,除了某些实现,Set 默认不保持任何顺序,这与 List 不同。因此,根据需求和它包含的元素类型,我们必须使用特定的策略来排序 Set。

Java Sets

在开始任何排序之前,了解 Set 接口的三种主要实现至关重要。

  • HashSet:此实现的元素不保证按任何特定顺序排列。
  • LinkedHashSet:它保持插入顺序。
  • TreeSet:它按照原始顺序或提供的比较器来保存项目。

排序 Set 通常涉及使用特定的 Set 类型(如 TreeSet)或将其转换为另一个集合。

为什么排序 Set?

Set 的主要目的是唯一性;在某些情况下,我们也希望对项目进行排序。例如,

  • 为了以有序的方式向消费者呈现元素。
  • 为了执行二分搜索,这需要已排序的材料。
  • 用于创建已排序的导出或报告。

排序 Set 的不同方法

  1. 使用 TreeSet
  2. 使用 List 进行排序然后转换回来
  3. 使用自定义比较器进行排序

使用 TreeSet

TreeSet 是保持 Set 按排序顺序的最简单方法。它会自动按其自然顺序排列元素,数字是按数值顺序,字符串是按字母顺序。

TreeSet 构造函数在接收另一个集合(如 HashSet)后,会自动以排序的方式对其成员进行排序。

示例

编译并运行

输出

The Sorted Set is given by: [C++, Java, Python]

注意:TreeSet 中的基本操作具有 O(log n) 的时间复杂度,并且内部基于 TreeMap。它要求每个元素都是可比较的,或者提供一个比较器。

使用 List 进行排序然后转换回来

由于 Set 无法直接提供排序方法,另一种方法是将 Set 转换为 List,使用 List.sort() 或 Collections.sort() 对 List 进行排序,然后,如果需要,将其转换回 LinkedHashSet 以保持排序顺序。

当使用自定义逻辑进行排序或在类似于 Set 的结构中保持排序顺序时,此方法效果很好。

示例

编译并运行

输出

The Sorted Set is given by: [1, 3, 5]

使用自定义比较器进行排序

自然顺序并不总是足够的。例如,您可能希望按字母顺序的逆序或按长度对字符串进行排序。在某些情况下,最好使用比较器对 List 进行排序,或者使用带有自定义比较器的 TreeSet。

示例

编译并运行

输出

The Sorted Set by Length: [C, Java, Python]

结论

在 Java 中排序 Set 时,理解 Set 接口的约束并选择最适合您用途的方法至关重要。如果我们想要一个自然排序的集合并且不介意开销,TreeSet 是最佳选择。如果我们想要对顺序进行更多控制或自定义排序算法,将 Set 转换为 List、对其进行排序,然后可能将其转换回 LinkedHashSet 是一种有效的方法。

最终,最有效的方法将取决于您应用程序的特定需求,包括与其他集合类型的兼容性、性能考虑和自定义顺序。如果我们了解这些排序方法,我们就可以在 Java 程序中更灵活、更精确地处理和显示不同的数据集合。

Java 中的 Set 排序选择题

Q1. 哪个 Java 类自动维护排序顺序的元素?

  1. HashSet
  2. LinkedHashSet
  3. TreeSet
  4. ArrayList
 

答案:C

解释:TreeSet 是 Java SortedSet 接口的组成部分。元素会自动以其自然顺序(或通过自定义比较器)进行维护。HashSet 和 LinkedHashSet 无法进行排序。


Q2. 在 Java 中,哪个方法用于对 List 进行排序?

  1. Arrays.sort()
  2. Collections.sort()
  3. Set.sort()
  4. List.sortBy()
 

答案: B

解释:Collections.sort() 是 Java 中对 List 进行排序的标准实用方法。它可以按自然顺序或使用自定义比较器对 List 进行排序。Set 本身没有 sort 方法。


Q3. 下列哪个保持插入顺序?

  1. HashSet
  2. TreeSet
  3. LinkedHashSet
  4. SortedSet
 

答案:C

解释:LinkedHashSet 不会改变元素添加的顺序。TreeSet 保持排序顺序而不是插入顺序,而 HashSet 则不保持。


Q4. Java 中的哪个集合不允许重复项并保持自定义顺序?

  1. HashMap
  2. 带有 Comparator 的 TreeSet
  3. ArrayList
  4. Vector
 

答案: B

解释:Java 的 TreeSet 集合可防止重复元素,并自动根据其固有顺序或在创建时提供的自定义 Comparator 来排列它们。因此,带有 Comparator 的 TreeSet 非常适合维护不重复的唯一顺序。


Q5. 下列哪个 Set 会自动按其正常顺序排列组件?

  1. HashMap
  2. ArrayList
  3. Vector
  4. TreeSet
 

答案: D

解释:TreeSet 是保持 Set 按排序顺序的最简单方法。它会自动按其自然顺序排列元素,数字是按数值顺序,字符串是按字母顺序。