假设我有一个具有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);
}
}
您提供的解决方案是正确的实现。
因为您只需要公开一个方法,因此它更具可读性。
使用Map
而不是手动迭代它总是好的
。
正如你所提到的,复杂性是O(1)
。
1回答您的问题
,因为它为在某些用例
中使用enum提供了一种更简洁的方法。
地图是不错的选择:更干净的代码和O(1)
。如果你使用for循环
,那么你得到的最好的是O(n)
你想要一张地图
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。到目前为止,由于枚举值和字符串