2014-10-02 59 views
0

我有2枚枚舉如下。在java中地圖2枚舉

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中獲取代碼?

+0

你是什麼意思的「地圖相同的名字」?你能擴展你實際想要做的事嗎?你想從一個枚舉類型轉換到另一個?你是否想給一個特定的'String'賦值? – unholysampler 2014-10-02 20:53:36

回答

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

也許?

0

我不認爲你真的想定義兩個枚舉,如果他們依賴於他們的name值。如果你仍然想雖然做到這一點,你可以把對枚舉實例在Map的鍵是他們的名字:

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

Tuple是一個簡單的元組:

class Tuple<T1, T2> { 
    T1 _1; 
    T2 _2; 
    public Tuple(T1 first, T2 second){ 
     this._1 = first; 
     this._2 = second; 
    } 
} 
0

別不要完全理解你想要做什麼,但我的理解是,你想從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()); 
     } 
    } 
} 

然而,這樣做絕對是更有效的方法。

1

您可以在枚舉中創建方法來獲取名稱並返回枚舉本身。以下是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(); 

Offcourse,你可以在這裏看到重複的問題。

+0

我想知道是否有可能創建一個標準的方式來檢索給定一個獨特屬性的枚舉。 – 2014-10-02 21:32:30

+0

這是正在計算器,我現在[在公衆中想知道](http://stackoverflow.com/q/26170107/589259):) – 2014-10-02 21:45:04

+0

反射?等等 - 你不想用它:-) – user1339772 2014-10-02 21:56:30

0

所以......這是非常醜陋的,但看起來可能的解決方案:與名稱值枚舉

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

在上面的「私人無效replaceName(字符串newName)將」代碼取代了第一和第二名。然後你可以用所需的數據構造地圖。但是...你真的需要它嗎?)

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()); 
} 
0

爲什麼不這樣做呢?

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