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
,我们也可以使用 LinkedList
或 Vector
(见 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);
可以看到,使用 TreeSet
对 HashSet
进行排序非常简单。我们只需要创建一个 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 上找到。