2008-10-27 39 views
21

考慮下面的Java枚舉:如何將enum的字符串結果與overridden toString()轉換回枚舉?

public enum AgeRange { 

    A18TO23 { 
     public String toString() {   
      return "18 - 23"; 
     } 
    }, 
    A24TO29 { 
     public String toString() {   
      return "24 - 29"; 
     } 
    }, 
    A30TO35 { 
     public String toString() {   
      return "30 - 35"; 
     } 
    }, 

} 

有沒有什麼辦法的字符串值轉換「18 - 23」到相應的枚舉值即AgeRange.A18TO23?

謝謝!

回答

30

一個記錄部分,做到這一點是這樣的最好的和最簡單的方法:

public enum AgeRange { 
    A18TO23 ("18-23"), 
    A24TO29 ("24-29"), 
    A30TO35("30-35"); 

    private String value; 

    AgeRange(String value){ 
     this.value = value; 
    } 

    public String toString(){ 
     return value; 
    } 

    public static AgeRange getByValue(String value){ 
     for (final AgeRange element : EnumSet.allOf(AgeRange.class)) { 
      if (element.toString().equals(value)) { 
       return element; 
      } 
     } 
     return null; 
    } 
} 

然後你只需要調用getByValue()方法輸入String輸入 在裏面。

7

你總是可以創建一個從字符串到值的映射 - 這樣做是靜態的,所以你只需要映射一次,假設返回的字符串在一段時間內保持不變。據我所知,沒有內置任何內容。

+0

這是一個更好的方法來處理這個問題。然後在枚舉出現時創建該映射,並且操作速度比迭代數組快得多。 – 2008-10-27 15:36:49

+0

我也在考慮這種方法,但在此枚舉中只有大約15個值。創建地圖效率更高嗎? – Walter 2008-10-29 02:43:59

+0

可能不是,說實話。哈希表對於大量數據非常有用,但我懷疑比較15個值(最糟糕的情況下)與獲取哈希碼一樣快,找到合適的存儲桶等。 – 2008-10-29 06:24:29

2
for (AgeRange ar: EnumSet.allOf(AgeRange)) { 
    if (ar.toString().equals(inString)) { 
     myAnswer = ar; 
     break; 
    } 
} 

或者類似的東西?剛輸入,沒有運行編譯器。原諒(評論)錯別字...

或者使用這樣的邏輯來構建一次地圖。避免在運行時進行迭代。好主意,喬恩。

2

該類重寫「toString()」 - 因此,要獲得相反的操作,您需要覆蓋valueOf()toString()的輸出轉換回Enum值。

public enum AgeRange { 

    A18TO23 { 
     public String toString() {   
       return "18 - 23"; 
     } 
     public AgeRange valueOf (Class enumClass, String name) { 
       return A18T023 
     } 
    }, 

    . 
    . 
    . 
} 

買家當心 - 未編譯的和未經考驗......

的機制toString()valueOf()是的API

0

你可以嘗試類似下面的東西?

static AgeRange fromString(String range) { 
    for (AgeRange ageRange : values()) { 
     if (range.equals(ageRange.toString())) { 
      return ageRange; 
     } 
    } 
    return null; 
} 

或者,正如其他人則建議,使用高速緩存方法:

private static Map<String, AgeRange> map; 

private static synchronized void registerAgeRange(AgeRange ageRange) { 
    if (map == null) { 
     map = new HashMap<String, AgeRange>(); 
    } 
    map.put(ageRange.toString(), ageRange); 
} 

AgeRange() { 
    registerAgeRange(this); 
} 

static AgeRange fromString(String range) { 
    return map.get(range); 
} 
4

根據有效的Java(第2版)第30項,也可以是(這是速度遠遠超過了循環)

public enum AgeRange { 
     A18TO23("18-23"), 
     A24TO29("24-29"), 
     A30TO35("30-35"); 

     private final String value; 

     AgeRange(String value){ 
      this.value = value; 
     } 

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

     private static final Map<String, AgeRange> stringToEnum = 
      new HashMap<String, AgeRange>(); 

     static { 
      for (AgeRange r : values()) { 
       stringToEnum.put(r.toString(), r); 
      } 
     } 

     public static AgeRange getByValue(String value){ 
      return stringToEnum.get(value); 
     } 
}