我对转换时使用什么标准对 Set 进行排序感兴趣?怎样才能覆盖它呢?因为据我了解,Set不存储排序信息。我正在谈论的转换示例:
Set<Object> objectsSet = new HashSet<>();
Objects[] objectsArray = (Objects[]) objectsSet.toArray();
未排序。
LinkedHashSet
保留插入顺序; HashSet
将由 hashCode()
内部订购。如果您想要排序的 Set
,请使用 TreeSet
(它实现 SortedSet
)。
SortedSet<Object> objectsSet = new TreeSet<>();
Objects[] objectsArray = (Objects[]) objectsSet.toArray();
至于改变顺序(升序或降序),可以在构造TreeSet(Comparator<? super E> comparator)
时使用
Set
。例如,对整数进行倒序排序;
SortedSet<Integer> intSet = new TreeSet<>(Comparator.reverseOrder());
关于问题的第二部分,可以通过作为构造数组的 stream 操作的一部分进行排序来覆盖排序:
Comparator<Object> myComparator = // ... Something that sorts this type of value
objectsSet.stream().sorted(someComparator).toArray();
Set.toArray
方法Javadocs指定给定Set
的迭代行为:
如果此集合对其迭代器返回其元素的顺序做出任何保证,则此方法必须以相同的顺序返回元素。
如果集合不能保证迭代器返回的元素的顺序,则特别未定义的一件事是数组中元素的顺序。
如果集合具有明确定义的遇到顺序(例如,它实现了 Java 21 中添加的
SequencedSet
接口),则数组中元素的顺序将与该类型集合的遇到顺序匹配。