按字段对一组元素进行排序

Sort a set of elements by their field

我有一个 set 个来自同一个 class 的对象,每个对象都有一个 Enum 字段,即 comparable。 我如何按该字段对集合进行排序? 我想到了类似的东西:

Collections.sort(A, enumField)

但当然 enumField 不是要比较的对象...

Collections.sort 不接受 Set。它只接受 Lists,所以首先你应该将你的集合转换为列表:

ArrayList<YourObject> list = new ArrayList<>(yourSet);

然后您可以使用自定义比较器调用 Collections.sort

Collections.sort(list, Comparator.comparing(x -> x.enumField));
// now "list" contains the sorted elements.

您可以将 Comparator#comparingStream

结合使用
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.sortSet 进行排序,因为它只消耗 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))));