当前位置: 首页 > 面试题库 >

通过其内部字段获取枚举

令狐宏伟
2023-03-14
问题内容

具有内部字段的枚举,有点像地图。

现在,我需要按其内部字段枚举。

写下:

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字段键入的值来填充它。

请注意,findByKey已完成staticnumber也已完成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)操作。

参考文献

  • JLS 8.7静态初始值设定项
  • JLS 8.9枚举

注意 values()

该方法的第二条println语句main显示了:values()每次调用都会返回一个新分配的数组!原始O(N)解决方案可以通过只调用values()一次并缓存阵列来做得更好,但是该解决方案仍然是O(N)平均水平。



 类似资料:
  • 问题内容: 我创建了一个简单的注释类: 我在像这样的一些类中使用它: 我知道我可以遍历声明的字段并获得如下注释: 如何在不迭代类的声明字段的情况下直接通过带注释的名称获取字段? 问题答案: 如果需要进行多次访问,则可以预处理注释。

  • 问题内容: 我已经编写了一个枚举类,我想按类型获取属性或按属性获取类型,但这似乎是不可能的。 上面的代码将无法编译。如何上班? 问题答案: 您需要做的就是添加一个默认情况,以便该方法始终返回某些内容或引发异常: 也许更好

  • 问题内容: 我有一个这样声明的枚举: 现在,我想通过反射找出该枚举的键(SystemRunning,SystemStopped,tmpIdle): 输出为:RUNNING STOPPED IDLE 但是,我想使用Strings SystemRunning,tmpIdle等。 提前非常感谢您。 问题答案: 首先,您需要使您的非静态变量。 然后,您需要在枚举中添加getter方法,该方法将返回 然后将

  • 我试图制作一个方法,获取封闭实例中的任何字段,对于一对2D坐标(其字段名以“X”结尾)的任何“X”组件具有整数值。 但我在编译器中得到的只是: 方法将这样使用: 我做错了什么?

  • 问题内容: 我想根据其字段值获取一个特定的枚举。 枚举: 获取一个新的枚举: 我一直在尝试为上述方法带来一个枚举,以便可以将其与其他信息一起存储在其中。 预期结果: 问题答案: 供参考,这是HashMap的替代解决方案: