簡體   English   中英

EnumSet 可以按書面順序返回值嗎?

[英]Can EnumSet return values in written order?

我有一個枚舉集

public static Set<T> getTypes() {
    return EnumSet.of(
            TYPE_1,
            TYPE_2,
            TYPE_3
            );
}

我想用 getter 方法從中獲取值

當我嘗試使用 foreach 循環獲取程序中的值時,它們總是以錯誤的順序出現。 有沒有辦法讓它們按照上面寫的正確順序排列? 謝謝!

每當您希望Set保持添加元素的順序時,有一個顯而易見的選擇: LinkedHashSet 這是 JDK 中唯一明確聲明它保留插入順序的Set實現(除非您告訴它使用最后訪問順序)。

EnumSet中元素的順序與枚舉常量的自然順序(即它們聲明的順序)相同。

EnumSet
    .of(DayOfWeek.SATURDAY, DayOfWeek.FRIDAY, DayOfWeek.THURSDAY)
    .forEach(System.out::println);

Output:

THURSDAY
FRIDAY
SATURDAY

如果您需要不同於自然順序的順序,您可以切換到使用List而不是Set

List
    .of(DayOfWeek.SATURDAY, DayOfWeek.FRIDAY, DayOfWeek.THURSDAY)
    .forEach(System.out::println);

Output:

SATURDAY
FRIDAY
THURSDAY

或者,如果您需要Set作為一種類型,則可以在enum中引入一個負責排序的屬性,並使用提供基於此屬性的ComparatorTreeSet

考慮以下虛擬enum

public enum MyEnum {
    ONE(3), TWO(2), THREE(1);
    private int order;

    MyEnum(int order) {
        this.order = order;
    }

    public int getOrder() {
        return order;
    }
}

將枚舉成員存儲到TreeSet中的示例:

Stream.of(MyEnum.ONE, MyEnum.TWO, MyEnum.THREE)
    .collect(Collectors.toCollection(
        () -> new TreeSet<>(Comparator.comparing(MyEnum::getOrder))
    ))
    .forEach(System.out::println);

Output:

THREE
TWO
ONE

Set不保持排序,所以與其使用List ,不如這樣:

public static List<T> getTypes() {
    return Arrays.asList(
            TYPE_1,
            TYPE_2,
            TYPE_3
    );
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM