Вы можете использовать static Map<Integer,TestEnum>
с инициализатором static
, который заполняет его значениями TestEnum
, указанными в их полях number
.
Обратите внимание, что findByKey
сделано static
и number
также было сделано final
.
import java.util.*;
public enum TestEnum {
ONE(1), TWO(2), SIXTY_NINE(69);
private final int number;
TestEnum(int number) {
this.number = number;
}
private static final Map<Integer,TestEnum> map;
static {
map = new HashMap<Integer,TestEnum>();
for (TestEnum v : TestEnum.values()) {
map.put(v.number, v);
}
}
public static TestEnum findByKey(int i) {
return map.get(i);
}
public static void main(String[] args) {
System.out.println(TestEnum.findByKey(69)); // prints "SIXTY_NINE"
System.out.println(
TestEnum.values() == TestEnum.values()
); // prints "false"
}
}
Теперь можно ожидать, что findByKey
будет O(1)
операция.
Ссылки
Смежные вопросы
Примечание по values()
Второй оператор println
в методе main
показывает: values()
возвращает вновь выделенный массив при каждом вызове!Исходное решение O(N)
могло бы быть немного лучше, если бы вы вызывали values()
только один раз и кэшировали массив, но это решение все равно будет в среднем O(N)
.