首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >从未知字符串中检索枚举值

从未知字符串中检索枚举值
EN

Stack Overflow用户
提问于 2020-05-27 11:38:13
回答 1查看 62关注 0票数 0

我有一个中等大小的Enum,在这个Enum中我想从给定的字符串中检索值。例如,

代码语言:javascript
复制
GAUL_RAM("gaul_ram.schem", new Location(Bukkit.getWorld(Statics.worldName), 0, 100, 0)),
GAUL_RAM_UPGRADED("gaul_ram_upgraded.schem", new Location(Bukkit.getWorld(Statics.worldName), 0, 100, 0)),  
GREEK_RAM("greek_ram.schem", new Location(Bukkit.getWorld(Statics.worldName), 0, 100, 0)),
GREEK_RAM_UPGRADED("greek_ram_upgraded.schem", new Location(Bukkit.getWorld(Statics.worldName), 0, 100, 0)),
PERSIA_RAM("persia_ram.schem", new Location(Bukkit.getWorld(Statics.worldName), 0, 100, 0)),
PERSIA_RAM_UPGRADED("persia_ram_upgraded.schem", new Location(Bukkit.getWorld(Statics.worldName), 0, 100, 0)),
CARTHAGE_RAM("carthage_ram.schem", new Location(Bukkit.getWorld(Statics.worldName), 0, 100, 0)),
CARTHAGE_RAM_UPGRADED("carthage_ram_upgraded.schem", new Location(Bukkit.getWorld(Statics.worldName), 0, 100, 0));

我有上面的枚举。我可能会被传递一个值,比如“波斯”。然后,我要做的是从波斯常量PERSIA_RAM及其Location对象中提取字符串值。

然而,我没有看到一种“干净”的方式来做这件事。想到的解决方案是检查提供的字符串"persia",通过Object[] possibleValues = enumValue.getDeclaringClass().getEnumConstants().toString().toLowerCase();遍历枚举中的所有值,然后在下划线“_”上使用某种分隔符,以获得枚举常量中的第一个单词。

再说一次,这不是一个圆滑的解决方案。有没有更好的方法来完成这项任务?

EN

回答 1

Stack Overflow用户

发布于 2020-05-27 12:14:50

您可以在装入类时创建一个HashMap字符串来枚举,这样就不必在每次查找枚举值时都执行字符串操作。下面是我如何做到这一点的一个例子:

代码语言:javascript
复制
public class Testing {
    public static final HashMap<String, Enum> map = new HashMap<>();

    public static void main(String[] args) {
        for (Enum e : Enum.values()) {
            map.put(e.toString().toLowerCase().split("_")[0], e);
        }

        System.out.println(map.get("persia").getString());
    }

    public enum Enum {
        GAUL_RAM("gaul_ram.schem", new Location(Bukkit.getWorld(Statics.worldName), 0, 100, 0)),
        GAUL_RAM_UPGRADED("gaul_ram_upgraded.schem", new Location(Bukkit.getWorld(Statics.worldName), 0, 100, 0)),  
        GREEK_RAM("greek_ram.schem", new Location(Bukkit.getWorld(Statics.worldName), 0, 100, 0)),
        GREEK_RAM_UPGRADED("greek_ram_upgraded.schem", new Location(Bukkit.getWorld(Statics.worldName), 0, 100, 0)),
        PERSIA_RAM("persia_ram.schem", new Location(Bukkit.getWorld(Statics.worldName), 0, 100, 0)),
        PERSIA_RAM_UPGRADED("persia_ram_upgraded.schem", new Location(Bukkit.getWorld(Statics.worldName), 0, 100, 0)),
        CARTHAGE_RAM("carthage_ram.schem", new Location(Bukkit.getWorld(Statics.worldName), 0, 100, 0)),
        CARTHAGE_RAM_UPGRADED("carthage_ram_upgraded.schem", new Location(Bukkit.getWorld(Statics.worldName), 0, 100, 0));

        private String arg0;
        private Location arg1

        private Enum (String s, Location l) {
            arg0 = s;
            arg1 = l
        }

        public String getString() {
            return arg0;
        }

        public Location getLoc() {
            return arg1;
        }
    }
}

这将返回:

代码语言:javascript
复制
persia_ram_upgraded.schem

请注意,这确实在您的一些枚举值之间留下了一些歧义。例如,PERSIA_RAMPERSIA_RAM_UPGRADED都对应于"persia"字符串。我建议您重命名,或者重新考虑如何访问枚举值。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/62035033

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档