繁体   English   中英

枚举和字符串之间的映射?

[英]Mapping between an enum and a string?

因此,我最近阅读了这篇文章,并且我想有效地做同样的事情。

我并不真正关心“丑陋”等等所以我实现了这样的方法之一:

public enum Day {

    Monday(1), 
    Tuesday(2), 
    Wednesday(3), 
    Thursday(4), 
    Friday(5), 
    Saturday(6), 
    Sunday(7);

    public final int id;

    Day(int id) {
        this.id = id;
    }

    public static Day getByID(int id) {
        Day d = null;
        for (Day dTemp : Day.values())
        {
            if (id == dTemp)
            {
                d = dTemp;
                break;
            }
        }

        return d;
    }

    public Day getNext() {
        return values()[(ordinal()+1)%values().length];
    }

    public Day getPrev() {
        return values()[(ordinal()-1)%values().length];
    }
}

但是,当我这样做时,它的问题出在if语句中:

if (id == dTemp)

它说它们是不兼容的类型。 我该怎么做才能解决这个问题?

使用if ( id == dTemp.id ) 枚举是类,而枚举值是不是int的对象,因此不能(显式或隐式)转换为int

另外,请注意,枚举具有序数,即其位置的id。 在您的示例中, Monday将具有序数0,而Sunday将具有序数6.您可以通过调用ordinal()方法来访问序号。

因此,如果id是基于一个的,则可以改为执行以下操作:

public static Day getByID(int id) {   
  //check id is between 1 and 7, I'll leave that for you
  return Day.values()[id - 1];
}

请注意,您可能想将Day.values()缓存在私有静态变量中,然后访问该缓存的数组。

顺便说一句,您在问题中提到的字符串在哪里?

if(id == dTemp.id)

应该管用。


或者尝试使用enumordinal()方法。

public final int ordinal()返回此枚举常量的序数(其在枚举声明中的位置,其中初始常量的序数为零)。 大多数程序员都没有使用这种方法。 它设计用于复杂的基于枚举的数据结构,例如EnumSet和EnumMap。

返回:此枚举常量的序数。


好吧,我复制了你的代码并做了相应的测试。

if (id == dTemp.ordinal()+1)

if(id == dTemp.id)

工作正常并按预期生产。 该声明

System.out.println(Day.Friday.getByID(1));

产生星期一

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM