【问题标题】:How to use an enum for an array subscript in Java如何在 Java 中使用枚举作为数组下标
【发布时间】:2014-10-14 08:12:27
【问题描述】:

如何将枚举用于数组下标?

enum {VALUE_ONE, ... , SIZE};
int[] x = new int[SIZE];

【问题讨论】:

  • 请详细解释一下您的问题。每个枚举都有一个静态方法values() 来获取它的所有值。使用ordinal() 来获取它在枚举中的位置。
  • 我想使用一组名称类似于枚举的常量值来遍历数组。

标签: java arrays enums


【解决方案1】:

这是代码。不过,这看起来不太好。

int[] x = new int[EnumClass.values().length];

然后您可以通过ordinal()访问该元素

int val = x[enumVar.ordinal()];

看起来仍然不是好的做法。

考虑像EnumMap<EnumClass, AtomicInteger> 一样使用Map<EnumClass, AtomicInteger>。为什么是原子整数?因为它可以修改它的值,而不是一直分配一个新实例(以可能不必要的同步为代价)。但这是一个不同的问题。

【讨论】:

  • 我不知道你想实现什么。 Map<Enum, AtomicInteger>?你有 EnumMap 为枚举设计的。对于任何数据结构,我都不会依赖枚举的序数值,因为它完全取决于定义顺序。假设您保存数组,修改枚举,并尝试读取数组。这将是一个问题。
【解决方案2】:

使用EnumMap - 它仅适用于这种情况。

enum Value {
    VALUE_ONE, ... , VALUE_LAKH
}
Map<Value, Integer> x = new EnumMap<>();
x.put(Value.VALUE_ONE, 13);

在内部使用一个数组 (Integer[])。唯一的缺点是使用Integer 而不是int。并且假设 java 9 或 10 将引入原始泛型类型(List&lt;int&gt; 等)。

顺便说一句,EnumSet 也存在,并且和BitSet 一样高效。

【讨论】:

    【解决方案3】:

    枚举不是数字。但是你可以做 SIZE.ordinal()

    【讨论】:

      【解决方案4】:

      对于下面的枚举

       enum test{VALUE_ONE, ... , SIZE};
      

      像这样使用 SIZE

      int[] x = new int[test.SIZE.ordinal()];
      

      【讨论】:

        【解决方案5】:

        您可以使用:int[] x = new int[SIZE.ordinal()]; int var = x[SOME_VALUE.ordinal()]; 它在其枚举声明中的位置,其中初始常量的序数为零。

        或者为每个枚举元素设置特殊编号。喜欢:

        enum A {
           VALUE_ONE(0),
           SIZE(1),
           ;
        
           int value;
        
           private A( int value) {
              this.value = value;
           }
        
           public int getValue() {
               return this.value;
           }
        }
        
        int[] x = new int[A.SIZE.getValue()];
        int var = x[A.VALUE_ONE.getValue()];
        

        【讨论】:

        • 当我尝试 System.out.println( x[A.VALUE_ONE.getValue()] );我得到 arrayOutOfBoundIndexException
        • VALUE_ONE(0), VALUE_TWO(1), 我使用了这些,但是当SIZE(2) 打印时它们都导致0
        • int[] x = new int[A.SIZE.getValue()]; int var1 = x[A.VALUE_ONE.getValue()];// var1 == 0 int var2 = x[A.VALUE_TWO.getValue()];// var2 == 0 你是这个意思?
        • 我设置了var = x[A.VALUE_ONE.getValue()],然后打印了var。我设置var 等于同一件事,但这次VALUE_TWO 他们都打印出 0
        • 你填充了数组 x 吗?默认情况下,数组填充为零。您的数组表示为[0, 0]
        猜你喜欢
        • 1970-01-01
        • 2012-03-13
        • 2018-01-17
        • 1970-01-01
        • 2014-05-14
        • 2010-09-29
        • 2010-11-02
        • 1970-01-01
        • 2019-11-17
        相关资源
        最近更新 更多