作者热门文章
- mongodb - 在 MongoDB mapreduce 中,如何展平值对象?
- javascript - 对象传播与 Object.assign
- html - 输入类型 ="submit"Vs 按钮标签它们可以互换吗?
- sql - 使用 MongoDB 而不是 MS SQL Server 的优缺点
有内部字段的枚举,一种 map 。
现在我需要通过其内部字段获取枚举。
这样写的:
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;
}
}
但是每次我需要找到合适的实例时,查找所有枚举并不是很有效。
有没有其他方法可以做到这一点?
最佳答案
您可以使用 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)
平均。
关于java - 通过其内部字段获取枚举,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2780129/
我是一名优秀的程序员,十分优秀!