1. 概述

*HashSet*java.util 包中的一个集合类。它继承自 AbstractSet 类并实现了 Set 接口。然而,HashSet 不会保留元素的顺序,因此需要寻找方法对这些元素进行排序。

在这篇快速教程中,我们将学习多种技巧来对 HashSet 的元素进行排序。

2. 使用 Collections.sort() 方法

Collections.sort() 方法用于对实现 java.util.List 接口的对象列表进行排序。因此,我们可以将 HashSet 转换为 List,然后使用 Collections.sort() 方法进行排序:

HashSet<Integer> numberHashSet = new HashSet<>();
numberHashSet.add(2);
numberHashSet.add(1);
numberHashSet.add(4);
numberHashSet.add(3);

// converting HashSet to arraylist
ArrayList arrayList = new ArrayList(numberHashSet);

// sorting the list
Collections.sort(arrayList);

assertThat(arrayList).containsExactly(1, 2, 3, 4);

在上面的例子中,我们首先将 HashSet 的元素复制到一个 ArrayList 中。然后,我们将 ArrayList 作为 Collections.sort() 方法的参数。除了 ArrayList,我们也可以使用 LinkedListVector(见 Java ArrayList vs Vector)。

3. 使用 TreeSet

通过这种方法,我们可以将 HashSet 转换为 TreeSet,它与 HashSet 类似,但存储元素时以升序排列。因此,当 HashSet 转换为 TreeSet 时,其元素就会按顺序排列:

HashSet<Integer> numberHashSet = new HashSet<>();
numberHashSet.add(2);
numberHashSet.add(1);
numberHashSet.add(4);
numberHashSet.add(3);

TreeSet<Integer> treeSet = new TreeSet<>();
treeSet.addAll(numberHashSet);

assertThat(treeSet).containsExactly(1, 2, 3, 4);

可以看到,使用 TreeSetHashSet 进行排序非常简单。我们只需要创建一个 TreeSet 实例,并传入 HashSet 列表即可。

4. 使用 stream().sorted() 方法

Java 8 引入的流(Stream API)提供了一种简洁的方式来对 HashSet 进行排序。stream().sorted() 方法允许我们在一组元素上执行函数式操作,并根据所使用的管道方法以所需的方式显示它们。

在示例中,我们将使用 stream().sorted() 方法,它返回一个已排序的流。值得注意的是,由于原始的 HashSet 保持不变,我们需要将排序结果保存到新的 Collection 中。我们将使用 collect() 方法将数据存储回一个新的 HashSet

HashSet<Integer> numberHashSet = new HashSet<>();
numberHashSet.add(200);
numberHashSet.add(100);
numberHashSet.add(400);
numberHashSet.add(300);

HashSet<Integer> sortedHashSet = numberHashSet.stream()
  .sorted()
  .collect(Collectors.toCollection(LinkedHashSet::new));

assertThat(sortedHashSet).containsExactly(100, 200, 300, 400);

需要注意的是,如果没有提供参数,使用 stream().sorted() 方法会按照自然顺序对 HashSet 进行排序。我们还可以重载它以定义自定义排序顺序。

5. 总结

在这篇文章中,我们讨论了如何使用三种方式在 Java 中对 HashSet 进行排序:使用 Collections.sort() 方法、TreeSet,以及使用 stream().sorted() 方法。

如往常一样,代码片段可在 GitHub 上找到。