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");
}