Простой вопрос перечисления

#java #enums

#java #перечисления

Вопрос:

как я могу выполнить обратный поиск строкового значения, если для данного перечисления задано значение int? итак, если мне присваивается значение int, равное 0, оно должно возвращать значение «Первокурсник 1», я не могу в этом разобраться.

 public enum YearsInSchool {
FRESHMAN1(0, "Freshman 1"), 
FRESHMAN2(1, "Freshman 2"), 
SOPHOMORE1(2, "Sophomore 1"), 
SOPHOMORE2(3, "Sophomore 2"), 
JUNIOR1(4, "Junior 1"), 
JUNIOR2(5, "Junior 2"), 
SENIOR1(6, "Senior 1"), 
SENIOR2(7, "Senior 2"), 
GRADUATE(8, "Graduate"), 
FACULTY(9, "Faculty");

private int intVal;
private String strVal;

YearsInSchool(int intValIn, String strValIn){
    intVal = intValIn;
    strVal = strValIn;      
}

public int getIntVal() {
    return intVal;
}

public String getStrVal() {
    return strVal;
}
  

}

Ответ №1:

YearsInSchool.values()[0]; даст вам первое значение enum.

Также в enum есть встроенный ordinal() метод, который возвращает его индекс в наборе. Кажется, что вы просто копируете это своим intVal .

Комментарии:

1. 1: Я бы удалил intVal, чтобы избежать путаницы с ordinal() . Вы можете сохранить values() в статическом конечном поле, что может повысить производительность, если часто вызываться. 😉

Ответ №2:

Если вы не хотите, чтобы это зависело от порядка следования констант, вы можете использовать таблицу подстановки, инициализированную в static блоке:

 public enum YearsInSchool {
    ...
    private static Map<Integer, YearsInSchool> intsToValues = new HashMap<Integer, YearsInSchool>();
    static {
        for (YearsInSchool y: values())
            intsToValues.put(y.getIntValue(), y);
    }

    public static YearsInSchool getByInt(int y) {
        return intsToStrings.get(y);
    }
}
  

Комментарии:

1. В целом это хороший метод, но если все, что нужно, — это определенный порядок, ordinal() это гораздо более простой подход.

Ответ №3:

Это должно вернуться FRESHMAN1 .

 YearsInSchool yis = (YearsInSchool) YearsInSchool.class.getEnumConstants()[0];
  

если вы «Новичок 1», вы должны быть в состоянии сделать yis.getStrVal()

Ответ №4:

Если вы используете ответ Балы, вы привязаны к тому, чтобы все было последовательно. Я предпочитаю создавать карту поиска.

 private static Map<Integer, YearsInSchool> intMap 
  = new HashMap<Integer, YearsInSchool>();
  

в вашем ctor добавьте строку
intMap.put(intVal, this);

добавьте метод

 public static YearsInSchool getByInt(int n) {
  return intMap.get(n); // error handling omitted here
}
  

Теперь вы можете добавить дополнительные значения enum для ситуаций, которые вы не рассматривали; вам не нужны все они по порядку. (Например, у вас могли бы быть перечисления для REDSHIRT_FRESHMAN и т.д.)

Ответ №5:

Просто используйте приведенный ниже код, и вы сможете вызвать метод getStrValIn в классе enum

 public enum YearsInSchool {
    FRESHMAN1(0, "Freshman 1"), FRESHMAN2(1, "Freshman 2"), SOPHOMORE1(2,
            "Sophomore 1"), SOPHOMORE2(3, "Sophomore 2"), JUNIOR1(4, "Junior 1"), JUNIOR2(
            5, "Junior 2"), SENIOR1(6, "Senior 1"), SENIOR2(7, "Senior 2"), GRADUATE(
            8, "Graduate"), FACULTY(9, "Faculty");

    private int intVal;
    private String strVal;

    YearsInSchool(int intValIn, String strValIn) {
        intVal = intValIn;
        strVal = strValIn;
    }

    public static String getStrValIn(int intValIn){

        YearsInSchool[] values = values();

        for (YearsInSchool yearsInSchool : values) {

            if(yearsInSchool.getIntVal() == intValIn){return yearsInSchool.getStrVal();}
        }

        return null;
    }

    public int getIntVal() {
        return intVal;
    }

    public String getStrVal() {
        return strVal;
    }

}
  

Это решит вашу проблему