Set 转换为 Array 时按什么顺序排序

问题描述 投票:0回答:3

我对转换时使用什么标准对 Set 进行排序感兴趣?怎样才能覆盖它呢?因为据我了解,Set不存储排序信息。我正在谈论的转换示例:

    Set<Object> objectsSet = new HashSet<>();
    Objects[] objectsArray = (Objects[]) objectsSet.toArray();

java arrays sorting arraylist set
3个回答
4
投票

未排序。

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());

0
投票

关于问题的第二部分,可以通过作为构造数组的 stream 操作的一部分进行排序来覆盖排序:

Comparator<Object> myComparator = // ... Something that sorts this type of value
objectsSet.stream().sorted(someComparator).toArray();

0
投票

Set.toArray
方法Javadocs指定给定
Set
的迭代行为:

如果此集合对其迭代器返回其元素的顺序做出任何保证,则此方法必须以相同的顺序返回元素。

如果集合不能保证迭代器返回的元素的顺序,则特别未定义的一件事是数组中元素的顺序。

如果集合具有明确定义的遇到顺序(例如,它实现了 Java 21 中添加的

SequencedSet
接口),则数组中元素的顺序将与该类型集合的遇到顺序匹配。

© www.soinside.com 2019 - 2024. All rights reserved.