2016-07-14 7 views
5

मेरे पास EnumSet है और बूलियन प्राइमेटिव्स के सरणी से/पीछे और पीछे कनवर्ट करना चाहते हैं। यदि यह बेहतर काम करता है, तो मैं एक सरणी के बजाय List और/या Boolean ऑब्जेक्ट्स के बजाय बूलियन प्राइमेटिव्स के साथ काम कर सकता हूं।EnumSet और बूलियन मानों की सरणी के बीच कनवर्ट करें

[TRUE, TRUE, FALSE] 

यहां यह प्रश्न इस एक, Convert an EnumSet to an array of integers के समान है:

enum MyEnum { DOG, CAT, BIRD; } 
EnumSet enumSet = EnumSet.of(MyEnum.DOG, MyEnum.CAT); 

क्या मैं दूसरे छोर पर प्राप्त करना चाहते हैं एक सरणी है कि इस तरह दिखता है। अंतर:

  • बूलियन या Boolean पूर्णांकों (जाहिर है)
  • मैं enum के सभी सदस्यों को एक TRUE साथ, प्रतिनिधित्व करने वाला प्रत्येक enum तत्व के लिए EnumSet में शामिल करना चाहते बनाम और प्रत्येक तत्व के लिए एक FALSE कि बाहर रखा गया है EnumSet से। अन्य प्रश्न के सरणी में केवल EnumSet में पाए गए आइटम शामिल हैं। (अधिक महत्वपूर्ण)

उत्तर

6

है कि आप मूल रूप से

MyEnum[] values = MyEnum.values(); // or MyEnum.class.getEnumConstants() 
boolean[] present = new boolean[values.length]; 
for (int i = 0; i < values.length; i++) { 
    present[i] = enumSet.contains(values[i]); 
} 

लिखते हैं दूसरी दिशा जा रहे हैं, बूलियन सरणी presentenumSet_ नीचे बनाया करने के लिए ऊपर बनाया से ऐसा करने के लिए।

EnumSet<MyEnum> enumSet_ = EnumSet.noneOf (MyEnum.class); // Instantiate an empty EnumSet. 
MyEnum[] values_ = MyEnum.values(); 
for (int i = 0 ; i < values_.length ; i ++) { 
    if (present[ i ]) { // If the array element is TRUE, add the matching MyEnum item to the EnumSet. If FALSE, do nothing, effectively omitting the matching MyEnum item from the EnumSet. 
     enumSet_.add (values_[ i ]); 
    } 
} 
+0

धन्यवाद द्वारा boolean पुरातन की एक सरणी से एक EnumSet मिलता है। मैं फैनसीर लैम्ब्डा/स्ट्रीम सिंटैक्स के बारे में उत्सुक था लेकिन सरल-लेकिन-सुनिश्चित पुराने-पुराने सिंटैक्स को दिखाने के लिए अच्छा है। –

+0

मैंने सरणी से एनमसेट तक दूसरी दिशा में जाने के लिए उदाहरण कोड लिखने की स्वतंत्रता ली। यह कोड मेरा कुछ कामकाजी कोड पर आधारित है, लेकिन यहां आपके उदाहरण से मेल खाने के लिए संशोधित किया गया है। इसलिए यदि मेरा कोड यहां पोस्ट किया गया है तो मैं 100% नहीं हूं। –

+0

@ बेसिलबोरक, 'क्वार्टरहॉअर' क्या है? – Andrew

2

जावा 8 में आप इस

List<Boolean> present = Arrays.stream(MyEnum.values()).map(enumSet::contains).collect(Collectors.toList()); 

है जैसे कि यह कर सकता है अन्य तरीके से जाने के लिए आप इस

IntStream.range(0, present.size()).filter(present::get).mapToObj(i -> MyEnum.values()[i]). 
    collect(Collectors.toCollection(() -> EnumSet.noneOf(MyEnum.class))); 
4

वर्तमान के लिए की तरह कुछ कर सकता है चारों ओर, मुझे नहीं पता

Boolean[] b = Arrays.stream(MyEnum.values()).map(set::contains).toArray(Boolean[]::new); 

से बेहतर समाधान देखें का उपयोग कर zip

MyEnum[] enums = zip(Arrays.stream(MyEnum.values()), Arrays.stream(b), 
    (e, b) -> b ? e : null).filter(Objects::nonNull).toArray(MyEnum[]::new); 
+1

शामिल विधि पूरे enum पर फिर से शुरू नहीं होगा। एनमसेट कार्यान्वयन, जंबोइनमसेट और रेगुलरएनमसेट दोनों में शामिल विधि ओवरराइड है। –

+1

@DLevant, धन्यवाद, मैंने सही किया – Andrew

संबंधित मुद्दे