0

我有Enum

public enum ServiceTypes {
    Zero("zero", 6, true),
    AVL("Avl", 1, true),
    VPS("vps", 2, true),
    CALCULATOR("calculator", 3, true),
    SIMULATOR("Simulator", 4, true),
    CONTRACT("Contract Output", 5, true),
    ALL("all", 7, true);
    private static final OrderComparator orderComparator = new OrderComparator();
    private static final OrderComparator nameComparator = new OrderComparator();

    @Nonnull
    public static ServiceTypes[] getOrderedServiceTypes() {
       Arrays.sort(values(), orderComparator);
       return values();
    }

    @Nonnull
    public static ServiceTypes[] getNamedServiceTypes() {
        Arrays.sort(values(), nameComparator);
        return values();
    }

    private static final class OrderComparator implements Comparator<ServiceTypes> {
        @Override
        public int compare(final ServiceTypes o1, final ServiceTypes o2) {
            return o1.getOrder().compareTo(o2.getOrder());
        }
    }

    private static final class AlphabeticalOrder implements Comparator<ServiceTypes> {
        @Override
        public int compare(final ServiceTypes o1, final ServiceTypes o2) {
            return o1.toString().compareTo(o2.toString());
        }
    }
}

当 I 时test getOrderedServiceTypes(),我将Zero("zero", 6, true)其视为第一个元素,这是不正确的。

似乎values()不是根据比较器排序的。

如何在 Enum 上运行自定义订单?

4

3 回答 3

6

不,发生的事情是values()每次都会创建一个新数组,因此您要对一个数组值进行排序,然后返回一个完全不同的数组

您需要做的就是例如

ServiceTypes[] values = values();
Arrays.sort(values, orderComparator);
return values;
于 2013-03-13T18:50:44.117 回答
2

似乎 values() 不是基于比较器排序的。

的确。根据规范(第 8.9.2 节):

( values[]) 返回一个包含此枚举类型常量的数组,按照它们的声明顺序。

values 对一次返回的数组进行排序不会产生任何影响 - 下一次调用时将分发一个新数组。你可以这样做:

public static ServiceTypes[] getNamedServiceTypes() {
    ServiceTypes[] array = values();
    Arrays.sort(array, nameComparator);
    return array;
}

或者我会亲自创建一个不可变的列表,按您关心的每种方式排序,并每次返回相同的列表引用。

于 2013-03-13T18:51:10.313 回答
0

只是另一个观察。您正在初始化orderComparatornameComparator作为 的对象OrderComparator。如果不是故意的,您需要查看它。

于 2013-03-13T18:55:26.597 回答