2012-10-28 2 views
33

में enum मानों की सूची क्या यह enum मानों के ArrayList (और इसे कुशल बनाना) बनाना संभव है? उदाहरण के लिए:जावा

enum MyEnum 
{ 
    ONE, TWO 
} 

MyEnum my = MyEnum.ONE; 
List <?> al = new ArrayList <?>(); 
al.add(my); 
al.remove(al.size()-1); 

उत्तर

17

हाँ, यह निश्चित रूप से संभव है, लेकिन आप

List<MyEnum> al = new ArrayList<MyEnum>(); 

फिर आप al के तत्वों को जोड़ सकते हैं करना होगा: al.add(ONE) या al.add(TWO)

+1

यह मेरे लिए एक खाली सूची देता है। –

+0

@ बेसिलबर्क यह प्रश्न की व्याख्या पर निर्भर करता है। मैंने एक स्पष्ट संपादन किया। – arshajii

10

यह संभव है, लेकिन आप EnumSet का उपयोग बजाय

enum MyEnum { 
    ONE, TWO; 
    public static final EnumSet<MyEnum> all = EnumSet.of(ONE, TWO); 
} 
+4

'एनमसेट' का उपयोग क्यों किया जाना चाहिए? यदि ओपी एक आदेशित सूची चाहता है तो क्या होगा? – arshajii

+0

हाँ, EnumSet का प्रयास करेंगे, लेकिन केवल ArrayList के बारे में उत्सुक है। – Alf

+3

@ एआरएस। 'एनमसेट' में तत्व प्राकृतिक क्रम में हैं। जावा दस्तावेज़ –

88

आप बस लिख सकते हैं

new ArrayList<MyEnum>(Arrays.asList(MyEnum.values())); 
+1

कोई बताता है कि यह "चुना गया उत्तर" क्यों नहीं है? – Debriter

+0

क्योंकि चुना गया उत्तर उतना अच्छा है जितना मुझे लगता है। –

2

यह एक अधिक सामान्य समाधान है, कि, किसी भी Enum वस्तु के लिए इस्तेमाल किया जा सकता तो मुक्त किया जाना चाहिए इस्तेमाल किया

static public List<Object> constFromEnumToList(Class enumType) { 
    List<Object> nueva = new ArrayList<Object>(); 
    if (enumType.isEnum()) { 
     try { 
      Class<?> cls = Class.forName(enumType.getCanonicalName()); 
      Object[] consts = cls.getEnumConstants(); 
      nueva.addAll(Arrays.asList(consts)); 
     } catch (ClassNotFoundException e) { 
      System.out.println("No se localizo la clase"); 
     } 
    } 
    return nueva; 
} 

अब आप इस तरह से कॉल करना होगा:

constFromEnumToList(MiEnum.class); 
+1

यह अविश्वसनीय रूप से अधिक जटिल है और किसी भी प्रकार की सुरक्षा प्रदान नहीं करता है (जावा में 'enum' प्रकार जोड़ा गया था) का कारण नहीं है। – squid314

+1

मुझे लगता है कि enum.values ​​() आपके enums का संग्रह प्राप्त करने के लिए एक बहुत आसान तरीका है। –

10

The Answer (EnumSet) अमित देशपांडे द्वारा और the Answer (.values) मार्को Topolnik से दोनों सही हैं। यहां कुछ और जानकारी दी गई है।

.values() विधि एक परोक्ष घोषित विधिEnum पर, संकलक द्वारा जोड़ा है। यह Collection की बजाय एक कच्चे सरणी का उत्पादन करता है। निश्चित रूप से प्रयोग योग्य।

प्रलेखन के बारे में विशेष ध्यान दें: असामान्य होने के नाते एक परोक्ष घोषित विधि के रूप में, .values() विधि नहींEnum वर्ग पर तरीकों की सूची में शामिल है। विधि defined in the Java Language Specification है, और Enum.valueOf के लिए दस्तावेज़ में उल्लेख किया गया है।

फास्ट & छोटे

EnumSet को तेजी में शामिल हैं:

  • चरम गति।
  • स्मृति का संक्षिप्त उपयोग।

    Enum सेट बिट वैक्टर के रूप में आंतरिक रूप से प्रतिनिधित्व कर रहे हैं:

वर्ग दस्तावेज़ के शब्दों में। यह प्रतिनिधित्व बेहद कॉम्पैक्ट और कुशल है। इस वर्ग का स्थान और समय प्रदर्शन पारंपरिक इंट-आधारित "बिट झंडे के लिए उच्च गुणवत्ता वाले, टाइपएफ़ विकल्प के रूप में उपयोग करने की अनुमति देने के लिए पर्याप्त होना चाहिए।"(जैसे containsAll और retainAll के रूप में) यहाँ तक कि थोक संचालन बहुत जल्दी चलाना चाहिए अगर उनके तर्क भी एक enum सेट है

इस enum को देखते हुए:।।

enum Animal 
{ 
    DOG , CAT , BIRD , BAT ; 
} 

एक पंक्ति में एक EnumSet बनाओ

EnumSet<Animal> allAnimals = EnumSet.allOf(Animal.class); 

डंप सांत्वना देने।

System.out.println("allAnimals : " + allAnimals); 

allAnimals: [कुत्ते, बिल्ली, बर्ड, बैट]

enum वस्तुओं के उपसमूह से एक सेट करें। the class doc पर

EnumSet<Animal> flyingAnimals = EnumSet.of(BIRD , BAT); 

देखो जोड़ने या तत्वों को निकाल लिया संग्रह हेरफेर करने के लिए कई तरह से देखने के लिए।

EnumSet<Animal> featheredFlyingAnimals = 
    EnumSet.copyOf(flyingAnimals).remove(BAT); 

स्वाभाविक क्रम

डॉक EnumSet के लिए इटरेटर का वादा किया प्राकृतिक व्यवस्था में है, जिस क्रम में enum के मूल्यों मूल रूप से घोषित किया गया।

इटरेटर इटरेटर विधि द्वारा वापस अपने प्राकृतिक क्रम (जिस क्रम में enum स्थिरांक घोषित कर रहे हैं) में तत्वों को पार करता:

वर्ग दस्तावेज़ के शब्दों में।

सचमुच, यह वादा दिया गया, मैं उलझन में हूं कि यह SortedSet क्यों नहीं है। लेकिन, ओह ठीक है, काफी अच्छा है। यदि वांछित है तो हम Set से List बना सकते हैं। ArrayList के निर्माता के लिए पास करें और उस संग्रह का Iterator स्वचालित रूप से आपकी ओर से कॉल किया जाता है।

List<Animal> list = new ArrayList<>(allAnimals); 

कंसोल पर डंप करें।

System.out.println("list : " + list); 

रन करते समय।

list : [DOG, CAT, BIRD, BAT] 
+0

इस उत्तर में महान अंतर्दृष्टि! – Alfabravo