كيفية تحويل نتيجة سلسلة من التعداد مع toString متجاوزة () مرة أخرى إلى التعداد؟

StackOverflow https://stackoverflow.com/questions/240122

سؤال

ونظرا لتعداد جافا التالية:

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

وشكرا!

هل كانت مفيدة؟

المحلول

وأفضل طريقة وأسهل للقيام بذلك هو من هذا القبيل:

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 في ذلك.

نصائح أخرى

ويمكنك دائما أن إنشاء خريطة من سلسلة القيمة - القيام بذلك بشكل ثابت لذا تحتاج فقط إلى الخريطة مرة واحدة، على افتراض أن سلسلة عاد لا يزال هو نفسه مع مرور الوقت. لا يوجد شيء المدمج في بقدر ما أنا على علم.

ووفقا للجافا الفعال (الطبعة 2ND) البند 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);
       }
}
for (AgeRange ar: EnumSet.allOf(AgeRange)) {
    if (ar.toString().equals(inString)) {
         myAnswer = ar;
         break;
    }
}

وأو شيء من هذا القبيل؟ فقط كتبته في، لم يتم تشغيلها من خلال مترجم. يغفر (التعليق على) الأخطاء المطبعية ...

وأو استخدام منطق مثل هذه لبناء خريطة واحدة. تجنب التكرار في وقت التشغيل. فكرة جيدة، جون.

وويتجاوز الطبقة "toString ()" - لذلك، للحصول على العملية العكسية، تحتاج إلى تجاوز valueOf() لترجمة إخراج toString() إلى القيم التعداد

public enum AgeRange {

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

    .
    .
    .
}

والمشتري حذار - uncompiled ولم تختبر ...

وآلية لtoString() وvalueOf() هي جزء موثقة لفي API

وقد تتمكن من محاولة شيء من هذا القبيل ما يلي؟

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);
}
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top