有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

java中的枚举值列表

是否可以创建枚举值的ArrayList(并对其进行操作)?例如:

enum MyEnum
{
   ONE, TWO
}

MyEnum my = MyEnum.ONE;
List <?> al = new ArrayList <?>();
al.add(my);
al.remove(al.size()-1);

共 (6) 个答案

  1. # 1 楼答案

    这是一个更通用的解决方案,可以用于任何枚举对象,因此请不要使用

    static public List<Object> constFromEnumToList(Class enumType) {
        List<Object> nueva = new ArrayList<Object>();
        if (enumType.isEnum()) {
            try {
                Class<?> cls = Class.forName(enumType.getCanonicalName());
                Object[] consts = cls.getEnumConstants();
                nueva.addAll(Arrays.asList(consts));
            } catch (ClassNotFoundException e) {
                System.out.println("No se localizo la clase");
            }
        }
        return nueva;
    }
    

    现在你必须这样称呼:

    constFromEnumToList(MiEnum.class);
    
  2. # 2 楼答案

    tl;博士

    你能从一个枚举中创建和编辑一个对象集合吗<是的

    如果不关心顺序,请使用^{},这是^{}的一个实现

    enum Animal{ DOG , CAT , BIRD , BAT ; }
    
    Set<Animal> flyingAnimals = EnumSet.of( BIRD , BAT );
    
    Set<Animal> featheredFlyingAnimals = flyingAnimals.clone().remove( BAT ) ;
    

    如果您关心顺序,请使用^{}实现,例如^{}。例如,我们可以创建一个列表,列出一个人在选择宠物时的偏好,按照他们最喜欢的顺序排列

    List< Animal > favoritePets = new ArrayList<>() ;
    favoritePets.add( CAT ) ;  // This person prefers cats over dogs…
    favoritePets.add( DOG ) ;  // …but would accept either.
                               // This person would not accept a bird nor a bat.
    

    对于不可修改的有序列表,请使用^{}

    List< Animal > favoritePets = List.of( CAT , DOG ) ;  // This person prefers cats over dogs, but would accept either. This person would not accept a bird nor a bat. 
    

    细节

    Amit Deshpande的The AnswerEnumSet)和Marko Topolnik的the Answer.values)都是正确的。这里有更多的信息

    Enum.values

    .values()方法是由编译器添加的^{}上的隐式声明方法。它生成一个粗糙的数组,而不是^{}。当然有用

    关于文档的特别注意事项:作为一个隐式声明的方法,不寻常的是.values()方法不是Enum类中列出的方法。方法是defined in the Java Language Specification,文档中提到了^{}

    EnumSet–快速和;小的

    ^{}的好处包括:

    • 极速
    • 内存的紧凑使用

    引用课堂文档:

    Enum sets are represented internally as bit vectors. This representation is extremely compact and efficient. The space and time performance of this class should be good enough to allow its use as a high-quality, typesafe alternative to traditional int-based "bit flags." Even bulk operations (such as containsAll and retainAll) should run very quickly if their argument is also an enum set.

    鉴于此枚举:

    enum Animal
    {
        DOG , CAT , BIRD , BAT ;
    }
    

    在一行中画一个EnumSet

    Set<Animal> allAnimals = EnumSet.allOf( Animal.class );
    

    转储到控制台

    System.out.println( "allAnimals : " + allAnimals );
    

    allAnimals : [DOG, CAT, BIRD, BAT]

    从枚举对象的子集创建一个集合

    Set<Animal> flyingAnimals = EnumSet.of( BIRD , BAT );
    

    查看the class doc以了解操作集合的许多方法,包括添加或删除元素

    Set<Animal> featheredFlyingAnimals = 
        EnumSet.copyOf( flyingAnimals ).remove( BAT );
    

    自然秩序

    文档承诺EnumSet的迭代器是自然顺序的,即最初声明enum值的顺序

    引用课堂文档:

    The iterator returned by the iterator method traverses the elements in their natural order (the order in which the enum constants are declared).

    坦白地说,考虑到这个承诺,我很困惑为什么这不是一个^{}。但是,哦,好吧,足够好了。如果需要,我们可以从Set创建一个^{}。将任何Collection传递给ArrayList的构造函数,该集合的^{}将自动代表您调用

    List<Animal> list = new ArrayList<>( allAnimals );
    

    转储到控制台

    System.out.println("list : " + list );
    

    跑步的时候

    list : [DOG, CAT, BIRD, BAT]
    

    在Java10及更高版本中,可以通过传递EnumSet来方便地创建不可修改的List。新列表的顺序将是EnumSet的迭代器顺序。{}的迭代器顺序是枚举的元素对象在该枚举上定义的顺序

    List< Animal > nonModList = List.copyOf( allAnimals ) ;  // Or pass Animals.values() 
    
  3. # 4 楼答案

    是的,这绝对是可能的,但你必须这么做

    List<MyEnum> al = new ArrayList<MyEnum>();
    

    然后可以将元素添加到alal.add(ONE)al.add(TWO)

  4. # 5 楼答案

    你可以简单地写

    new ArrayList<MyEnum>(Arrays.asList(MyEnum.values()));
    
  5. # 6 楼答案

    这是可能的,但您应该使用^{}

    enum MyEnum {
        ONE, TWO;
        public static final EnumSet<MyEnum> all = EnumSet.of(ONE, TWO);
    }