有一定的枚举
enum MyEnum {
FOO, BAR, BAZ, QUX, ARG, ANT;
}
以及其值的数组/列表(比枚举的“长度”长MyEnum.values().length
,但这并不重要)。
MyEnum[] vals = {MyEnum.BAR, MyEnum.BAZ, MyEnum.ARG, MyEnum.ANT, MyEnum.FOO, MyEnum.QUX, MyEnum.ANT, MyEnum.FOO};
为什么使用标准方法对该数组进行排序会Arrays.sort
产生以下结果:
Arrays.sort(vals);
System.out.println(Arrays.toString(vals));
// [FOO, FOO, BAR, BAZ, QUX, ARG, ANT, ANT]
如何获取按字母顺序排序的枚举值数组?
Java 中的枚举是以下形式的类
Enum<E extends Enum<E>>
,这些类又实现接口Comparable<E>
,也就是说,枚举通过实现方法来支持自然排序Enum::int compareTo(E o)
。文档指出,此方法中实现的自然顺序是声明枚举常量的顺序:
事实上,值用于按自然顺序进行比较
ordinal
(参见Open JDK 8 中的示例实现)因此,要按字母顺序对枚举数组进行排序,
Arrays::sort(T[] arr, Comparator<? super T> cmp)
将字段/方法比较器传递给重载方法就足够了Enum::name()
:List::sort(Comparator<? super E> cmp)
在对 Stream API 中的列表、流Stream::sorted(Comparator<? super E> cmp)
或排序集/优先级队列等进行排序时,应使用类似的比较器。