#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;
}
}
Это решит вашу проблему