【问题标题】:How to convert an array of integers to array of enums?如何将整数数组转换为枚举数组?
【发布时间】:2025-12-25 15:45:15
【问题描述】:

我有一个整数数组,需要将其转换为枚举数组。

enum my_enum {
    APPLE, BANANA, ORANGE;
    int getColorAsInt() { ... }
};
int[] foo = some_method_i_cannot_modify();
my_enum[] bar = ??? ( foo );

最简单的方法是什么?

Here 我找到了一种将单个整数转换为枚举值的方法(他们在示例中使用了Color 枚举):

public static Color convertIntToColor(int iColor) {
    for (Color color : Color.values()) {
        if (color.getColorAsInt() == iColor) {
            return color;
        }
    }
    return null;
}

...但我希望有一种更直接的方法来进行这种转换(否则在我的代码中,首先使用枚举是没有意义的)。

Here 是一个关于将单个整数转换为枚举值的 SO 问题。

【问题讨论】:

  • 那么你会得到什么整数,getColorAsInt 返回什么?
  • Convert from enum ordinal to enum type 的可能重复项 - 假设您的整数代表枚举序数,即
  • @daniu 不确定我是否理解您的问题。我确定我的整数在有效范围内,并且我正在寻找的函数应该返回给定整数的枚举值,最好是整数数组作为输入,枚举值数组作为输出。
  • @AlexSavitsky 实际上我同意重复,但由于这里的答案已经提出了超出欺骗答案的解决方案,我只是在问题中添加了一个注释
  • @user463035818 我主要标记重复项以提供对相关问题和/或答案的轻松访问,而不是为了关闭欺骗。 SO 缺少将问题标记为“相关”的功能(例如,像在 JIRA 中一样)而不将其作为重复项关闭。答案确实提供了超出链接内容的有用信息

标签: java arrays enums


【解决方案1】:

这取决于您的 foo 数组中的内容。如果是枚举的ordinals,那么简单的事情就足够了。

enum my_enum { APPLE, BANANA, ORANGE };
int[] foo = {0,2,2,1};
public void test(String[] args) {
    my_enum[] bar = new my_enum[foo.length];
    for (int i = 0; i < foo.length; i++) {
        bar[i] = my_enum.values()[foo[i]];
    }
    System.out.println(Arrays.toString(bar));
}

打印

[苹果、橙子、橙子、香蕉]

streams 等效项类似于:

    my_enum[] es = Arrays.stream(foo)
            .mapToObj(i -> my_enum.values()[i])
            .toArray(my_enum[]::new);

【讨论】:

  • 看起来不错。我建议的唯一改进是只调用 values() 一次。这每次都会分配一个新数组。
  • 它假定int 值与枚举值声明顺序“同步”,并且数组的int 值在非常特定的范围内,从 0 到枚举值的数量 -1。它做了很多假设。
  • @cppbeginner 我希望编译器为我们做优化,而values() 只是一个访问器。在进行“过早优化”之前更好地测试这是否可以随时进行改进
  • @pdem 如果编译器进行这样的优化会很好,但根据这个答案(从 2015 年开始)它没有。 *.com/a/32804662/6253321
  • @davidxxx - 我以为我在前两句话中已经涵盖了这些内容。
【解决方案2】:

您需要使用循环或流来遍历输入的整数数组并将每个整数映射到Color 实例。试试这个:

int[] array = getArrayOfInts();
Color[] colors = Arrays.stream(array)
            .mapToObj(i -> convertIntToColor(i))
            .filter(Objects::nonNull)
            .toArray(Color[]::new);

【讨论】:

  • 如果使用不同的数组(但当然是相同的枚举)执行多次,这可以改进吗?顺便说一句,我知道整数在有效范围内,这是否意味着我可以跳过 filter(Objects::nonNull)
  • 你的意思是性能提升吗?我宁愿保留filter() 调用(因为convertIntToColor () 可能按设计返回null)或更改方法impl并返回特殊的非null值,您可以引入Color.UNKNOWN实例来表示无法识别的颜色。
【解决方案3】:

这一行代码将返回对象数组,您可以访问枚举 通过 arr[0]

Object[] arr = Arrays.stream(my_enum.values()).map(x->x).toArray();

【讨论】:

    【解决方案4】:

    但我希望有更直接的方法来进行这种转换

    你没有选择。因为您有 int 值,并且您想将它们转换为枚举值。
    因此,对于每个ints,您都必须找到对应的枚举值,并且无论如何。

    您有一种更直接的方法,即在其声明中使用枚举的顺序
    但这是一种非常容易出错的方法,它假定 int 值从 0 开始并递增 1。

    【讨论】:

    • 要从整数值中找到枚举值,不必为每次查找循环整个枚举。这就是我所说的“更直接”。容易出错是什么意思?
    • 您可以使用 Map 进行直接访问,但请注意,在迭代几个元素或使用 map 的性能方面并没有太大区别。
    【解决方案5】:

    如果是你的enum,你当然可以先给它映射。

    public enum MyEnum {
        APPLES(10), ORANGES(20);
    
        private int asInt;
        private MyEnum(int val) {
            asInt = val;
        }
        public int getIntValue() { return asInt; }
    
        static final Map<Integer, MyEnum> mapping = new HashMap();
        static {
            for (MyEnum e : MyEnum.values()) {
                mapping.put(e.getIntValue(), e);
            }
        }
        static MyEnum fromInteger(int val) {
            return mapping.get(val);
        }
    }
    

    【讨论】:

      【解决方案6】:

      我会制作一个地图,从那里获取一个映射值。当然使用自己的 id 比序数更好,但要显示一个想法:

      enum Color {
          RED, GREEN, BLUE;
      
          public static Color[] create(int[] ids) {
              Map<Integer, Color> colors = Arrays.stream(Color.values())
                      .collect(Collectors.toMap(Enum::ordinal, Function.identity()));
              return Arrays.stream(ids)
                      .mapToObj(colors::get)
                      .filter(Objects::nonNull)
                      .toArray(Color[]::new);
          }
      };
      
      public static void main(String[] args) {
          int[] foo = new int[]{0,1,2};
          System.out.println(Arrays.toString(Color.create(foo)));
      }
      

      输出

      [RED, GREEN, BLUE]
      

      【讨论】:

        【解决方案7】:

        最好使用 Java 处理 List,但有转换工具。也更喜欢使用 Java 约定:MyEnum。

        enum MyEnum {
        
            APPLE, BANANA, ORANGE;
        
            public static void main(String[] arg) {
                int[] foo = new int[] { 2, 0, 1 };
                MyEnum[] bar = Arrays.stream(foo).boxed().map(
                    i->MyEnum.values()[i]
                ).toArray(MyEnum[]::new);
        
            }
        
        
        };
        

        使用数组和int 使使用流变得复杂,主要是使用:i-&gt;MyEnum.values()[i] 从 int 到 enum 转换 要使用此函数转换,您需要可从流中访问的 map 方法。

        【讨论】:

        • 6 个答案在我创建答案期间,我失去了快速答案挑战。