当前位置: 首页 > 知识库问答 >
问题:

从字符串转换为具有大量值的 Java 枚举 [重复]

富凯旋
2023-03-14

假设我有一个具有100个值的枚举。为了简单起见,请举以下示例:

public enum code
{
    CODE_1("string1"),
    CODE_2("string2"),
    CODE_3("string3"),
    CODE_4("string4"),
    ...
}

我想创建一个公共方法来将具有已知格式的字符串(如"string1","string2"…)转换为适当的枚举值CODE_1,CODE_2…通常这是通过遍历所有值来完成的,如果找到匹配项,则返回该枚举值。(详细信息可以在这个问题中找到。)

但是,我关心的是对所有值的正则化循环。这可能是一个巨大的瓶颈吗?如果不是100个元素,而是1000个元素呢?

作为我自己的练习,我尝试用一个静态映射来优化这个查找,它可以确保给定任何字符串的O(1)查找时间。我喜欢这个额外的技巧,但我只想在实际需要时将其包含在我的代码中。你对使用迭代法和地图法有什么想法和发现?

public enum Code
{
    ...
    //enum values
    ...


    //The string-to-Code map
    private static final Map<String,Code> CODE_MAP = populateMap();

    private static Map<String,Code> populateMap()
    {
        Map<String,Code> map = new HashMap<String,Code>();

        for(Code c : Code.values())
        {
            map.put(c.getCode(), c);
        }

        return map;
    }


    private String code;

    private Code(String code)
    {
        this.code = code;
    }

    public String getCode()
    {
        return this.code;
    }

    public Code convertFromString(String code)
    {
        //assume that the given string is actually a key value in the map

        return (Code) CODE_MAP.get(code);
    }
}

共有3个答案

易祖鹤
2023-03-14

您提供的解决方案是正确的实现。

因为您只需要公开一个方法,因此它更具可读性。

使用Map而不是手动迭代它总是好的

正如你所提到的,复杂性是O(1)

1回答您的问题,因为它为在某些用例中使用enum提供了一种更简洁的方法。

魏泰
2023-03-14

地图是不错的选择:更干净的代码和O(1)。如果你使用for循环,那么你得到的最好的是O(n)

松阳泽
2023-03-14

你想要一张地图

public enum Code {
    CODE_1("string1"),
    CODE_2("string2"),
    CODE_3("string3"),
    // etc
    ;

    private static class Holder {
        static Map<String, Code> CODE_MAP = new HashMap<>();
    }

    private final String code;

    private Code(String code) {
        this.code = code;
        Holder.CODE_MAP.put(code, this);
    }

    public String getCode() {
        return this.code;
    }

    public Code convertFromString(String code) {
        return Holder.CODE_MAP.get(code);
    }
}

这是可行的,因为类装入器在初始化枚举类之前初始化内部静态类,因此分配了映射以准备好加载持久的枚举实例初始化。

无循环。没有用于加载映射的特殊代码(在构造函数中完成)。最少的代码。

 类似资料:
  • 问题内容: 假设我有一个包含100个值的枚举。为了简单起见,请采用以下示例: 我想创建一个公共方法,以将具有已知格式(例如“ string1”,“ string2” …)的字符串转换为适当的枚举值CODE_1,CODE_2 …通常是通过遍历所有值来完成的,如果找到匹配项,返回该枚举值。 但是,我担心规则循环遍历所有值。这可能是一个巨大的瓶颈吗?如果不是100个元素而是1000个呢? 作为我自己的练

  • 本文向大家介绍Java将枚举转换为字符串,包括了Java将枚举转换为字符串的使用技巧和注意事项,需要的朋友参考一下 示例 有时您想将枚举转换为String,有两种方法可以实现。 假设我们有: 那么,我们如何将类似的东西转换Fruit.APPLE为"APPLE"? 使用转换 name() name()是一个内部方法,enum该方法返回String枚举的表示形式,返回值精确String表示枚举值的定义

  • 我有一个枚举文件,在其中我为PaymentTypes定义了一个对象: 这样我就有了可以使用的东西:

  • 问题内容: 我定义了以下枚举 现在的印刷价值是 相反,我想打印枚举的值 要实现此功能可以做些什么? 问题答案: 您正在打印枚举 对象 。如果只想打印该属性,请使用该属性: 请参阅 对枚举成员及其属性 的 编程访问权限 部分 : 如果您有枚举成员并需要其名称或值: 如果只需要提供自定义字符串表示形式,则可以向枚举添加方法: 演示:

  • 我定义了以下枚举 现在打印值为 相反,我想打印枚举的值 可以做什么来实现这个功能?

  • 问题内容: 我觉得这是一个简单的问题,但是我尝试过的所有事情都不适合我。我有一个枚举,我有字符串构造函数的原因是因为Java不允许枚举为数字..我在没有字符串构造函数的情况下直接尝试了AA,AB,2C,但这给出了错误。请注意,对于现有的枚举,我要添加C(“ 2C”)。 现在我有一个mybatis映射器,它会进行合并,这是现有的,并且映射器的参数之一是TestEnum。到目前为止,由于枚举值和字符串