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

时间:2018-06-02 11:10:31

标签: java enums comparable

我有来自同一个班级的set个对象,每个对象都有一个Enum字段,即comparable。 我怎样才能对该字段进行排序? 我想过这样的事情:

Collections.sort(A, enumField)

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

3 个答案:

答案 0 :(得分:2)

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.

答案 1 :(得分:2)

您可以将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); 

答案 2 :(得分:2)

您无法使用SetCollections.sort进行排序,因为它只会消耗List<T>

相反,您可以使用提供的比较器设置TreeSet

Set<A> mySet = new TreeSet<>(Comparator.comparing(A::getEnumField));

意思是元素将在您添加时进行排序。

或者如果您无法控制更改已包含元素的集合,则可以使用流API,使用上述比较器收集到TreeSet,然后生成新的{{1}使用已排序的元素。

TreeSet