如何将整数数组转换为枚举数组?

时间:2018-04-03 13:07:10

标签: java arrays enums

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

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是关于将单个整数转换为枚举值的问题。

7 个答案:

答案 0 :(得分:4)

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

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

答案 1 :(得分:3)

这取决于foo数组中的内容。如果它是枚举的ordinal,那么这样简单就足够了。

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));
}

打印

  

[APPLE,ORANGE,ORANGE,BANANA]

streams等价物将类似于:

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

答案 2 :(得分:1)

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

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

答案 3 :(得分:0)

  

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

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

你在声明中使用枚举的顺序有一个更直接的方式 但这是一种非常容易出错的方法,它假设int值从0开始增加1。

答案 4 :(得分:0)

如果是你的public class UpdateDepartmentDescriptionCommand { [Required, Range(1, long.MaxValue)] public long DepartmentId { get; set; } [Required, StringLength(256)] public string Description { get; set; } } public HttpResponseMessage UpdateDepartmentDescription(UpdateDepartmentDescriptionCommand cmd) { // validate command var validationResults = new List<ValidationResult>(); var isValid = Validator.TryValidateObject(cmd, new ValidationContext(cmd, null, null), validationResults, true); if (!isValid) { return Request.CreateResponse(HttpStatusCode.BadRequest, validationResults); } // retrieve Department from DB using the given ID var department = _departmentDAL.Find(cmd.DepartmentId); // only update values defined by the usecase department.Description = cmd.Description; var ok = _departmentDAL.Update(department); return Request.CreateResponse(HttpStatusCode.OK, ok); } ,你当然可以给它开始映射。

enum

答案 5 :(得分:0)

我会制作一张地图,从那里获取一个映射值。当然使用自己的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]

答案 6 :(得分:0)

最好在List with Java上工作但有转换工具。也更喜欢使用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->MyEnum.values()[i]从int到enum转换 要使用此功能转换,您需要可从流中访问的map方法。