有内场,地图的枚举.
现在我需要通过其内部领域获得枚举.
写道:
package test;
/**
* Test enum to test enum =)
*/
public enum TestEnum {
ONE(1), TWO(2), THREE(3);
private int number;
TestEnum(int number) {
this.number = number;
}
public TestEnum findByKey(int i) {
TestEnum[] testEnums = TestEnum.values();
for (TestEnum testEnum : testEnums) {
if (testEnum.number == i) {
return testEnum;
}
}
return null;
}
}
Run Code Online (Sandbox Code Playgroud)
但是每次我需要找到合适的实例时,查看所有枚举并不是非常有效.
有没有其他方法可以做同样的事情?
pol*_*nts 58
您可以使用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"
}
}
Run Code Online (Sandbox Code Playgroud)
您现在可以期待findByKey
成为一项O(1)
操作.
values()
方法中的第二个println
语句main
是揭示:values()
返回每个invokation的新分配的数组!O(N)
通过只调用values()
一次并缓存数组,原始解决方案可以做得更好,但该解决方案仍然是O(N)
平均的.
Ale*_*yak 17
虽然有人建议使用Map<Integer, TestEnum>
三思而后行.
您的原始解决方案,尤其是小型枚举,可能比使用HashMap更快.
在你的枚举包含至少30到40个元素之前,HashMap可能不会更快.
这是"如果没有损坏,请不要修理"的一个案例.