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());
        }
    }
}

私が、最初の要素としてtest getOrderedServiceTypes()表示されますが、これは正しくありません。Zero("zero", 6, true)

values()コンパレータに基づいてソートされていないようです。

列挙型でカスタムオーダーを実行するにはどうすればよいですか?

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 1回ソートしても効果はありません。次の呼び出しで、新しい配列が配布されます。ただし、これは可能です。

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

または、気になる方法でソートされた不変のリストを個人的に作成し、毎回同じリスト参照を返します。

于 2013-03-13T18:51:10.313 に答える
0

ちょうど別の観察。orderComparatorとの両方nameComparatorのオブジェクトとして初期化していますOrderComparator。意図されていない場合は、それを確認する必要があります。

于 2013-03-13T18:55:26.597 に答える