具有内部字段的枚举,有点像地图。
现在,我需要按其内部字段枚举。
写下:
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; } }
但是,每次需要查找适当的实例时,对所有枚举进行查找并不是非常有效。
还有其他方法可以做到吗?
您可以将a staticMap<Integer,TestEnum>与static初始化程序一起使用,该初始化程序将使用TestEnum由其number字段键入的值来填充它。
staticMap<Integer,TestEnum>
static
TestEnum
number
请注意,findByKey已完成static,number也已完成final。
findByKey
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)操作。
O(1)
values()
该方法的第二条println语句main显示了:values()每次调用都会返回一个新分配的数组!原始O(N)解决方案可以通过只调用values()一次并缓存阵列来做得更好,但是该解决方案仍然是O(N)平均水平。
println
main
O(N)