按字段对一组元素进行排序
Sort a set of elements by their field
我有一个 set
个来自同一个 class 的对象,每个对象都有一个 Enum
字段,即 comparable
。
我如何按该字段对集合进行排序?
我想到了类似的东西:
Collections.sort(A, enumField)
但当然 enumField
不是要比较的对象...
Collections.sort
不接受 Set
。它只接受 List
s,所以首先你应该将你的集合转换为列表:
ArrayList<YourObject> list = new ArrayList<>(yourSet);
然后您可以使用自定义比较器调用 Collections.sort
:
Collections.sort(list, Comparator.comparing(x -> x.enumField));
// now "list" contains the sorted elements.
您可以将 Comparator#comparing
与 Stream
结合使用
Set<T> sorted = set.stream()
.sorted(Comparator.comparing(A::getEnumField))
.collect(Collectors.toCollection(LinkedHashSet::new))
我们需要保持秩序,这就是收集到 LinkedHashSet
的原因。但是,这仅在您不打算向集合中添加任何其他元素时才有效。更好的选择是使用 TreeSet
Set sorted = new TreeSet<>(Comparator.comparing(A::getEnumField))));
sorted.addAll(set);
您不能用 Collections.sort
对 Set
进行排序,因为它只消耗 List<T>
.
相反,您可以使用提供的比较器使您的集合成为 TreeSet
:
Set<A> mySet = new TreeSet<>(Comparator.comparing(A::getEnumField));
意味着元素将在您添加时进行排序。
或者,如果您无法控制更改其中已有元素的集合,则可以使用流 API,使用上述比较器收集到 TreeSet
,然后生成具有已排序元素的新 TreeSet
。
Set<A> sortedSet = mySet.stream()
.collect(Collectors.toCollection(() ->
new TreeSet<>(Comparator.comparing(A::getEnumField))));
我有一个 set
个来自同一个 class 的对象,每个对象都有一个 Enum
字段,即 comparable
。
我如何按该字段对集合进行排序?
我想到了类似的东西:
Collections.sort(A, enumField)
但当然 enumField
不是要比较的对象...
Collections.sort
不接受 Set
。它只接受 List
s,所以首先你应该将你的集合转换为列表:
ArrayList<YourObject> list = new ArrayList<>(yourSet);
然后您可以使用自定义比较器调用 Collections.sort
:
Collections.sort(list, Comparator.comparing(x -> x.enumField));
// now "list" contains the sorted elements.
您可以将 Comparator#comparing
与 Stream
Set<T> sorted = set.stream()
.sorted(Comparator.comparing(A::getEnumField))
.collect(Collectors.toCollection(LinkedHashSet::new))
我们需要保持秩序,这就是收集到 LinkedHashSet
的原因。但是,这仅在您不打算向集合中添加任何其他元素时才有效。更好的选择是使用 TreeSet
Set sorted = new TreeSet<>(Comparator.comparing(A::getEnumField))));
sorted.addAll(set);
您不能用 Collections.sort
对 Set
进行排序,因为它只消耗 List<T>
.
相反,您可以使用提供的比较器使您的集合成为 TreeSet
:
Set<A> mySet = new TreeSet<>(Comparator.comparing(A::getEnumField));
意味着元素将在您添加时进行排序。
或者,如果您无法控制更改其中已有元素的集合,则可以使用流 API,使用上述比较器收集到 TreeSet
,然后生成具有已排序元素的新 TreeSet
。
Set<A> sortedSet = mySet.stream()
.collect(Collectors.toCollection(() ->
new TreeSet<>(Comparator.comparing(A::getEnumField))));