假设我有一个枚举:
enum EnumDemo{
A1,
A2,
A3,
B1,
B2,
B3,
C1,
C2,
C3
}
我应该使用什么方法来创建可以包含多个 EnumDemo 元素的枚举集,但所有元素都应该来自一个组,例如:
{A1, B2, C1}, {B1, C2},但不是 {A1, A3, B1, C1}
任何想法表示赞赏:)
假设我有一个枚举:
enum EnumDemo{
A1,
A2,
A3,
B1,
B2,
B3,
C1,
C2,
C3
}
我应该使用什么方法来创建可以包含多个 EnumDemo 元素的枚举集,但所有元素都应该来自一个组,例如:
{A1, B2, C1}, {B1, C2},但不是 {A1, A3, B1, C1}
任何想法表示赞赏:)
您可以使用该EnumSet.of
方法生成集合,这将是最简单和最易读的:
Set<EnumDemo> setA = EnumSet.of(EnumDemo.A1, EnumDemo.A2, EnumDemo.A3);
Set<EnumDemo> setB = EnumSet.of(EnumDemo.B1, EnumDemo.B2, EnumDemo.B3);
Set<EnumDemo> setB = EnumSet.of(EnumDemo.C1, EnumDemo.C2, EnumDemo.C3);
从那里您可以使用Collections
并集或差异来生成您想要的不同集。
如果您希望避免遇到A1
可以将 an 添加到已经包含的集合中的问题,A2
您必须使用逻辑 OR 自己处理这个问题,方法是创建三个仅包含其各自成员的不同 Enum 类型 ( EnumA
, EnumB
, )。EnumC
您可以保留其所属组的每个枚举元素 id。并基于此 id 创建枚举组:
enum EnumDemo{
A1(0),
A2(0),
A3(0),
B1(1),
B2(1),
B3(1),
C1(2),
C2(2),
C3(2);
private int groupId;
private EnumDemo(int groupId) {
this.groupId = groupId;
}
public static Set<EnumDemo> getGroup(int groupId) {
Set<EnumDemo> group = EnumSet.noneOf(EnumDemo.class);
for (EnumDemo value : values()) {
if (value.groupId == groupId) {
group.add(value);
}
}
return group;
}
}
如果组是静态的并且不随时间变化,这种方法很好。您也可以创建 enum likeGroup
并使用它而不是 int 作为 id。您也可以在您的应用程序中动态更改groupId
元素,但我不确定这是一个好方法。
将它们分成不同的enum
类型怎么样?
public interface EnumDemo {
}
enum AEnumDemo implements EnumDemo { A1, A2, A3 }
enum BEnumDemo implements EnumDemo { B1, B2, B3 }
enum CEnumDemo implements EnumDemo { C1, C2, C3 }
然后,您可以将EnumSet<? extends EnumDemo>
其用作您的集合的类型。
EnumSet<? extends EnumDemo> demos1 = EnumSet.allOf(AEnumDemo.class);
EnumSet<? extends EnumDemo> demos2 = EnumSet.allOf(BEnumDemo.class);
EnumSet<? extends EnumDemo> demos3 = EnumSet.of(AEnumDemo.A1, AEnumDemo.A3);
EnumSet<? extends EnumDemo> demos4 = EnumSet.of(BEnumDemo.B1, BEnumDemo.B2, BEnumDemo.B3);
EnumSet<? extends EnumDemo> demos5 = EnumSet.of(AEnumDemo.A1, BEnumDemo.B2); // compile error