如何将枚举与分组和子分组层次结构/嵌套一起使用

Posted

技术标签:

【中文标题】如何将枚举与分组和子分组层次结构/嵌套一起使用【英文标题】:How to use enum with grouping and subgrouping hierarchy/nesting 【发布时间】:2013-11-09 22:02:20 【问题描述】:

我有一个名为Exampleenum 'class' 如下:

enum Example 
//enums belonging to group A:
   enumA1,
   enumA2,
   enumA3,
//enums belonging to group B:
   enumB1,
   enumB2,
   enumB3,
//enums belonging to group C:
   enumC1,
   enumC2,
   enumC3;

对我的项目很重要,我使用的所有枚举都属于Example(因为这是类的构造函数中的参数)。

我如何使用enumhierarchy/nesting 来实现以下目标:

1234563 /li>

能够对组ABC 的子组执行相同的操作。例如,组 A 可能有子组 abc。然后我想要一种方法来执行诸如Example.enumA1.isSubGroupBelonging(SubGroup.a) 之类的操作,即public boolean

一种无需复杂的enum 名称即可完成所有这些操作的方法,这会阻塞我的代码。例如,能够在我的其他课程中引用Example.enumA1 而无需使用Example.enumA1(Group.A,SubGroup.a)Example.enumA1.Group.A.SubGroup.a 之类的东西来引用它会很好

【问题讨论】:

【参考方案1】:

我会使用一个非常简单的枚举构造函数,它将相应的组与枚举值相关联:

public enum Example 

    ENUM_A1 (Group.A),
    ENUM_A2 (Group.A),
    ENUM_A3 (Group.A),

    ENUM_B1 (Group.B),
    ENUM_B2 (Group.B),
    ENUM_B3 (Group.B),

    ENUM_C1 (Group.C),
    ENUM_C2 (Group.C),
    ENUM_C3 (Group.C);

    private Group group;

    Example(Group group) 
        this.group = group;
    

    public boolean isInGroup(Group group) 
        return this.group == group;
    

    public enum Group 
        A,
        B,
        C;
    

用法:

import static Example.*;
import Example.Group;
...

ENUM_A1.isInGroup(Group.A);  // true
ENUM_A1.isInGroup(Group.B);  // false

要创建子组,您可以对 Group 进行与 Example 类似的结构,使用 Group(SubGroup ... subgroups) 作为构造函数并使用 EnumSet<SubGroup> 来包含子组。

【讨论】:

优秀的解决方案!我还会添加getGroup() 方法来获取当前组。 美女!比我想要的更好!【参考方案2】:

您可以使用EnumSet 对各种枚举进行分组,而无需创建单独的Enum 类:

public enum Example 

    ENUM_A1, ENUM_A2, ENUM_A3,
    ENUM_B1, ENUM_B2, ENUM_B3,
    ENUM_C1, ENUM_C2, ENUM_C3;

    public static EnumSet<Example> groupA = EnumSet.of(ENUM_A1, ENUM_A2, ENUM_A3);
    public static EnumSet<Example> groupB = EnumSet.of(ENUM_B1, ENUM_B2, ENUM_B3);
    public static EnumSet<Example> groupC = EnumSet.of(ENUM_C1, ENUM_C2, ENUM_C3);

   

public static void main(String[] args)
    if(Example.groupA.contains(Example.ENUM_A1))
       System.out.println("Group A contains ENUM A1");
    

【讨论】:

另见here EnumSet 中是否有保证顺序?例如,我希望按照 ENUM_A3、ENUM_A1、ENUM_A2 的顺序为 groupA 枚举。不确定 EnumSet 是否能保证我的顺序 EnumSet 不保证订单,但您可以使用 'Collections.sort(new ArrayList(Example.groupA))' 来订购! @Wendel 这不会做任何事情,因为您将无权访问该列表。【参考方案3】:

小补充:

我确实喜欢@ELEVATE 和@Wendel 的两个答案。它(一如既往)取决于何时使用哪种解决方案。 如果每个条目都必须是单个组的一部分,我更喜欢 ELEVATE 的解决方案,因为它迫使我添加这个单个组。但是,如果只需要对一些枚举进行分组或者它们不是不同的,我会选择 Wendel 的解决方案,因为它更灵活(但更容易出错)

【讨论】:

以上是关于如何将枚举与分组和子分组层次结构/嵌套一起使用的主要内容,如果未能解决你的问题,请参考以下文章

SpringBoot入门教程:枚举嵌套分组

嵌套字典:按日期分组,然后按枚举值分组并汇总计数

XSL muenchian-多层次分组和嵌套

将数据分组到 Pandas 多索引

Python使用matplotlib可视化树状图层次聚类系统树图树状图根据给定的距离度量将相似点分组在一起并根据点的相似性将它们组织成树状图链接起来(Dendrogram)

将查询分组为组和子组