【问题标题】:Select enum by ordinal; java [duplicate]按序数选择枚举; java [重复]
【发布时间】:2020-04-18 11:48:12
【问题描述】:

是否可以获得带有序数的枚举?

enum SimpleJackCards {
    As(11), König(10), Dame(10), Bube(10), Zehn(10), Neun(9), Acht(8),
    Sieben(7), Sechs(6), Fünf(5), Vier(4), Drei(3),Zwei(2), Yolly (1);
    private int value;
    SimpleJackCards(int val) {
        value = val;
    }
    int getValue (){
        return value;
    }
}

例如

我想写一个给我一张随机卡片的方法……我会随机化一个整数。

并希望使用生成的序号获取该枚举。

即:序数值 0 将是枚举 As,其值为 11

【问题讨论】:

标签: java random enums


【解决方案1】:

您可以使用随机生成的数字作为索引(表示序数)简单地访问values() 返回的数组:

// i.e.: if someRandomNumber = 0, then randomCard will be "As"
SimpleJackCards randomCard = SimpleJackCards.values()[someRandomNumber];

【讨论】:

    【解决方案2】:

    Enum 上没有按序号检索它的方法。你必须自己做。

    public static SimpleJackCards getByOrdinal(int ordinal) {
        return Arrays.stream(SimpleJackCards.values())
                .filter(e -> e.ordinal() == ordinal)
                .findFirst()
                .orElseThrow(() -> new RuntimeException("Invalid ordinal"));
    }
    

    如果不想每次都循环遍历枚举常量,可以构造一个映射,在序数和枚举常量之间进行映射。

    private static final Map<Integer, SimpleJackCards> ORDINAL_TO_ENUM;
    
    static {
        ORDINAL_TO_ENUM = Arrays.stream(SimpleJackCards.values())
                    .collect(Collectors.toMap(Enum::ordinal, Function.identity()));
    }
    
    public static SimpleJackCards getByOrdinal2(int ordinal) {
          return ORDINAL_TO_ENUM.get(ordinal); //returns null if passed an invalid ordinal
    }
    

    【讨论】:

    • 或者你可以只索引values()返回的数组。这似乎比你在这里做的要简单得多。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-12-06
    • 2019-08-02
    • 2017-06-11
    相关资源
    最近更新 更多