我有来自同一个班级的set
个对象,每个对象都有一个Enum
字段,即comparable
。
我怎样才能对该字段进行排序?
我想过这样的事情:
Collections.sort(A, enumField)
但当然enumField
不是要比较的对象......
答案 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#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);
答案 2 :(得分:2)
您无法使用Set
对Collections.sort
进行排序,因为它只会消耗List<T>
。
相反,您可以使用提供的比较器设置TreeSet
:
Set<A> mySet = new TreeSet<>(Comparator.comparing(A::getEnumField));
意思是元素将在您添加时进行排序。
或者如果您无法控制更改已包含元素的集合,则可以使用流API,使用上述比较器收集到TreeSet
,然后生成新的{{1}使用已排序的元素。
TreeSet