java中的映射2枚举

java中的映射2枚举,java,jakarta-ee,enums,Java,Jakarta Ee,Enums,我有两个枚举,如下所示 enum enum1 { TEST_1("name_1","name 1"), TEST_2("name_2","name 2"); private String name; private String description; public String getName() { return name; } public String getDescription

我有两个枚举,如下所示

enum enum1 {
    TEST_1("name_1","name 1"),  
    TEST_2("name_2","name 2");  

    private String name;  
    private String description;  

    public String getName() {  
        return name;  
    }  

    public String getDescription() {  
        return description;  
    }  
}  

enum enum2 {
    TEST_ENUM_1("name_1",1),  
    TEST_ENUM_2("name_2",2);  

    private String name;  
    private int code;  

    public String getCode(){  
        return code;  
    }  

    public int getName(){  
        return name;  
    }
}
如何映射2个枚举中的相同名称,并从枚举1获取消息和从枚举2获取代码

enum enum3 {
private enum1 e1;
private enum2 e2;
...
}

也许?

如果两个枚举依赖于它们的
名称
值,那么我认为您不想定义它们。如果仍要执行此操作,可以将成对的枚举实例放在
映射中,键为它们的名称:

public static void main() {
    Map<String, Tuple<enum1, enum2>> map = new HashMap<>();
    map.put("name_1", new Tuple<>(enum1.TEST_1, enum2.TEST_ENUM_1));
    map.put("name_2", new Tuple<>(enum1.TEST_2, enum2.TEST_ENUM_2));
}

我不完全理解您试图做什么,但我的理解是,您希望从enum1和enum2获取所有匹配名称的描述和代码。在这种情况下,你可以这样做

for(enum1 e1 :enum1.values())
{
    for(enum2 e2 : enum2.values())
    {
        if(e1.getName().equals(e2.getName()))
        {
            //Do what you will with description and code (prints out in this case)
            System.out.println(e1.getDescription() + " " + e2.getCode());
        }
    }
}

不过,这肯定是更有效的方法

您可以在enum中创建方法以获取名称并返回enum本身。下面是enum2的示例,您可以对enum1执行相同的操作

 public static enum2 get( String name )
        {
            for ( enum2  sp : values() )
            {
                if ( sp.getName() .equals( name) )
                {
                    return sp;
                }
            }
            throw new AssertionError( "Invalid name " + name );
        }
然后

String enum1Message = enum1.get("name_1").getDescription();
String enum2Code = enum2.get("name_1").getCode();

当然,你可以在这里看到复制的问题。

所以。。。这很难看,但看起来可能是解决方案:

enum FirstEnum {

    FIRST("name_1", "name 1"),
    SECOND("name_2", "name 2");

    FirstEnum(String name, String description) {
        replaceName(name);
        this.name = name;
        this.description = description;
    }
    private String name;
    private String description;

    private void replaceName(String newName) {
        try {
            Field fieldName = getClass().getSuperclass().getDeclaredField("name");
            fieldName.setAccessible(true);
            fieldName.set(this, newName);
            fieldName.setAccessible(false);
        } catch (NoSuchFieldException | SecurityException | IllegalArgumentException | IllegalAccessException e) {
            e.printStackTrace();
        }
    }

    public String getName() {
        return name;
    }

    public String getDescription() {
        return description;
    }

    @Override
    public String toString() {
        return getName();
    }
}

enum SecondEnum {

    FIRST("name_1", 1),
    SECOND("name_2", 2);

    SecondEnum(String name, Integer code) {
        replaceName(name);
        this.name = name;
        this.code = code;
    }
    private String name;
    private Integer code;

    private void replaceName(String newName) {
        try {
            Field fieldName = getClass().getSuperclass().getDeclaredField("name");
            fieldName.setAccessible(true);
            fieldName.set(this, newName);
            fieldName.setAccessible(false);
        } catch (NoSuchFieldException | SecurityException | IllegalArgumentException | IllegalAccessException e) {
            e.printStackTrace();
        }
    }

    public Integer getCode() {
        return code;
    }

    public String getName() {
        return name;
    }

    @Override
    public String toString() {
        return getName();
    }
}
在上面的代码中,“private void replaceName(String newName)”用name值替换枚举中的第一个和第二个。然后,您可以使用所需的数据构建映射。但是你真的需要它吗?)

Map result=newhashmap();
for(对象键:FirstEnum.values()){
字符串keyString=String.valueOf(key);
put(keyString,SecondEnum.valueOf(keyString.getCode());
}
为什么不这样做呢

enum enum1 {
    TEST_1(enum2.TEST_ENUM_1, "name 1"),
    TEST_2(enum2.TEST_ENUM_2, "name 2");
}

“映射相同的名称”是什么意思?你能详细说明你实际上想做什么吗?您正在尝试从一种枚举类型转换为另一种枚举类型吗?您正在尝试获取给定特定
字符串的值吗?我想知道是否可以创建一种标准方法来检索给定唯一属性的枚举。这是stackoverflow,我现在是:)反射?等等-您不想使用它:-)
Map<String, Integer> result = new HashMap<String, Integer>();
for (Object key : FirstEnum.values()) {
    String keyString = String.valueOf(key);
    result.put(keyString, SecondEnum.valueOf(keyString).getCode());
}
enum enum1 {
    TEST_1(enum2.TEST_ENUM_1, "name 1"),
    TEST_2(enum2.TEST_ENUM_2, "name 2");
}