[英]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
中引入一個負責排序的屬性,並使用提供基於此屬性的Comparator
的TreeSet
。
考慮以下虛擬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.