21

次の Java 列挙型を指定します。

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 に変換する方法はありますか?

ありがとう!

4

6 に答える 6

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

于 2008-10-27T14:56:20.467 に答える
7

文字列から値へのマップはいつでも作成できます。静的に作成すると、返された文字列が時間の経過とともに同じままであると仮定して、一度だけマップする必要があります。私の知る限り、何も組み込まれていません。

于 2008-10-27T14:48:14.947 に答える
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);
       }
}
于 2012-03-20T05:46:54.303 に答える
2
for (AgeRange ar: EnumSet.allOf(AgeRange)) {
    if (ar.toString().equals(inString)) {
         myAnswer = ar;
         break;
    }
}

それともそのようなものですか?入力しただけで、コンパイラを実行していません。誤字脱字お許し(コメント)…

または、このようなロジックを使用して、マップを一度構築します。実行時の反復は避けてください。いい考えだ、ジョン。

于 2008-10-27T14:50:44.350 に答える
2

このクラスは「toString()」をオーバーライドします。そのため、逆の操作を行うには、オーバーライドvalueOf()して出力をtoString()Enum 値に変換する必要があります。

public enum AgeRange {

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

    .
    .
    .
}

バイヤーは注意してください-コンパイルもテストもされていません...

APIの文書化された部分toString()のメカニズムvalueOf()

于 2008-10-27T14:54:29.550 に答える
0

You could try something like the following?

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

Or, as others suggested, using a caching approach:

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);
}
于 2008-10-27T15:06:31.510 に答える