【问题标题】:how to use an enum as an array index in java如何在java中使用枚举作为数组索引
【发布时间】:2015-08-25 08:35:32
【问题描述】:

我将 12 个值存储在一个数组中,每个值代表某个月份的一段数据。我有一个一年中所有月份的枚举,并且希望能够选择一个显示正确数据的月份,而不是使用数组索引。有没有办法做到这一点?谢谢

【问题讨论】:

标签: java arrays enums


【解决方案1】:

我建议不要将枚举成员用作数组索引,因为存在枚举成员的数字索引会发生变化的风险(如果添加了新成员或成员的顺序在枚举类中发生了更改)。

相反,我将使用 Map<Month, Data> 以便每个枚举成员都指向映射中的 Data 对象(或您需要使用的任何其他类型):

Map<Month, Data> monthMap = new HashMap<>();
monthMap.put(Month.MARCH, dataObject);
Data retrievedData = monthMap.get(Month.MARCH);

更新:如果您的Map 使用枚举类型作为其键,那么使用EnumMap 而不是HashMapTreeMap 等总是更有效。所以上面的代码最好这样开始:

Map<Month, Data> monthMap = new EnumMap<>(Month.class);

在幕后,EnumMap 实际上是维护一个数组,其索引与枚举实例对齐,正如 OP 希望手动实现的那样。

【讨论】:

  • 如果 OP 不需要使用数组,这应该是公认的答案
【解决方案2】:

如果您有一周中的天数,例如:

public enum Days {
    SUNDAY, MONDAY, TUESDAY, WEDNESDAY,
    THURSDAY, FRIDAY, SATURDAY 
}

和数组,如:String days[]=new String[7]

数组中的索引只能由int完成。所以你可以使用枚举作为索引:

days[Days.SUNDAY.ordinal()]="sunday";
System.out.println(days[Days.SUNDAY.ordinal()]);

Output:sunday

Ordinal() 返回enum 常量在enum 声明中的位置。 但它看起来并不那么优雅。

【讨论】:

    【解决方案3】:

    例如,您的枚举如下:

    public enum Month {
        January, February, March, April, May, June, July, August, September, October, November, December
    }
    

    然后您可以使用ordinal() 来获得数字表示(您定义的索引)。 其中name() 返回枚举的名称

    这里有一个例子,它向你展示了两个 em 的用法:

        Month[] months = Month.values();
    
        Month m = Month.August;
        System.out.println(String.format("Month #%d > %s", m.ordinal(), months[m.ordinal()].name()));
    

    【讨论】:

      猜你喜欢
      • 2010-09-29
      • 2010-11-02
      • 2012-03-13
      • 2019-11-17
      • 2016-06-26
      • 1970-01-01
      • 1970-01-01
      • 2010-10-01
      • 1970-01-01
      相关资源
      最近更新 更多