有 Java 编程相关的问题?

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

java如何返回通用枚举的枚举元素列表?

我正在和一个朋友做一个纸牌游戏,我决定做一个纸牌查看器,我们将所有的纸牌细节输入一个文本文档,我的程序逐行读取每张纸牌

不同类型的卡具有不同的属性,所有属性都在某种类型的枚举中表示

我有一些将字符串列表转换为枚举属性列表的代码。示例枚举:

public enum Race{
ELVES, HUMANS, DWARFS
} 

public enum Rarity{
COMMON, UNCOMMON, RARE
}

假设一张卡可以有多个种族和多个稀有性,我想制作一个方法,可以获取字符串列表和枚举类型,并返回枚举值列表,例如

// Take in an array of strings and a type of Enum value to convert them to
public <Type extends Enum<Type>> Type[] getValues(String[] strings){

// Make an array to hold the enum values
Type[] values = new Type[strings.length];

// For each string, convert it into an enum value and add it to the array
for (int i = 0; i < strings.lenght; i++)
    values[i] = Type.valueOf(strings[i]);

return values;
}

我知道这个方法不起作用,但我希望它至少描述了我正在尝试做的事情,我想要一个方法,我可以发送任何字符串列表,它将它们转换为枚举值列表,例如,将字符串{“精灵”,人类}转换为相关的种族值{精灵,人类}

你可能会问,为什么我不单独制作一些方法,比如

convertRaceStings(String[] strings){//method workings here}
convertRarityStings(String[] strings){//method workings here}

不幸的是,这里使用的两个枚举都是简单的示例,还有更多的枚举需要另一个方法


共 (4) 个答案

  1. # 1 楼答案

    Java中的枚举非常强大。由于枚举是常量,无法动态添加,因此可以执行以下操作:

    public enum Race {
        ELVES, HUMANS, DWARFS;
    
        public static Race getValue(String name) {
            switch (name.toLowerCase()) {
                case "evles": return EVLES;
                case "humans": return HUMANS;
                case "dwarfs": return DWARFS;
                default: throw new Exception();
            }
        }
    }
    

    这假设您使用的是Java 7,但如果不是,则用else if语句替换开关

  2. # 2 楼答案

    您应该使用枚举集而不是枚举数组。它的内存效率更高。 作为奖励,您不必处理泛型数组

    然后,您的方法将如下所示:

    private static <T extends Enum<T>> EnumSet<T> createEnumSet(Class<T> clazz, String... values) {
        EnumSet<T> set = EnumSet.noneOf(clazz);
        for(String value : values) {
            set.add(Enum.valueOf(clazz, value));
        }
        return set;
    }
    

    除非您需要具有同一枚举的多个实例

    用法:

    final EnumSet<Race> races = createEnumSet(Race.class, "HUMANS", "DWARFS");
    
  3. # 3 楼答案

    如果还传递了枚举类型,则会更容易—这将使您能够使用^{} static method

    public static void main(String[] args) {
        System.out.println(get("ELVES", Race.class));
        System.out.println(get("COMMON", Rarity.class));
    }
    
    public static <T extends Enum<T>> T get(String value, Class<T> clazz) {
        return Enum.valueOf(clazz, value);
    }
    
    public static enum Race {
    
        ELVES, HUMANS, DWARFS
    }
    
    public static enum Rarity {
    
        COMMON, UNCOMMON, RARE
    }
    

    如果不想将enum类作为第二个参数传递,则需要在某个位置维护映射

  4. # 4 楼答案

    在通用代码中使用数组有点烦人

    @SuppressWarnings("unchecked")
    public <E extends Enum<E>> E[] getValues(Class<E> clazz, String[] strings) {
      E[] result = (E[])java.lang.reflect.Array.newInstance(clazz, strings.length);
      for (int i = 0; i < strings.length; ++i) {
        result[i] = Enum.valueOf(clazz, strings[i]);
      }
      return result;
    }
    

    这应该行得通