Why does Collections.sort()
apply only for List
s and not for Set
s? Is there any particular reason?
问题:
回答1:
Most (but not all) Set
implementations do not have a concept of order, so Collections.sort
does not support them as a whole. If you want a set with a concept of order, you can use something like a TreeSet
:
A
NavigableSet
implementation based on aTreeMap
. The elements are ordered using their natural ordering, or by aComparator
provided at set creation time, depending on which constructor is used.
Or a LinkedHashSet
:
Hash table and linked list implementation of the
Set
interface, with predictable iteration order. This implementation differs fromHashSe
t in that it maintains a doubly-linked list running through all of its entries. This linked list defines the iteration ordering, which is the order in which elements were inserted into the set (insertion-order)
回答2:
A Set, by definition, has no order.
回答3:
A Set
is not a List
. While a List
, by contract, is supposed to retain insertion order (otherwise, methods such as .get(someindex)
would not make any sense), this is not the case for a Set
. You have no method to get an element at a particular index in a Set
! Neither do you have methods to insert at a particular position etc.
More specifically, the ordering of Set
is undefined; however, implementations of Set
can add ordering constraints.
For instance:
LinkedHashSet
retains insertion ordering;TreeSet
maintains natural ordering of its elements, either because its elements implementComparable
, or because you supply aComparator
.
If you sorted a LinkedHashSet
, you would break its insertion ordering guarantee!
回答4:
A set is not ordered. You can use SortedSet. Or you can create a List from the set and sort it.
回答5:
List is an ordered set of elements while Set is not which implies that none of Set elements will have any sequence number. So you can't sort it.