2013-01-08 13 views
9

मेरे पास 4 मानों के साथ एक enum है, और मेरे पास एक विधि हस्ताक्षर है जो एक enum मान स्वीकार करता है। मैं कुछ enum मानों के साथ कुछ करने में सक्षम होना चाहता हूं जो कुछ करने के लिए तर्क के रूप में पारित नहीं किया गया है()।एक enum मानों के सबसेट के माध्यम से लूप

public void doSomething(EnumThing thing){ 
    EnumThing[] thingValues = EnumThing.values(); 
    List<EnumThing> valuesNotPassedAsArg = new ArrayList<EnumThing>(); 
    for(EnumThing th : thingValues){ 
     valuesNotPassedAsArg.add(th); 
    } 
    valuesNotPassAsArg.remove(thing); 
    //here I would loop through all valuesNotPassAsArg and do something with them 
} 

public enum EnumThing{ 
SOMETHING, SOMETHINGELSE, ANOTHERTHING; 
} 

क्या ऐसा करने का कोई क्लीनर तरीका है? मुझे लगता है जैसे लूप को चीज़ से आइटम प्राप्त करने के लिए वैल्यूज़ सरणी अनिवार्य है।

+1

'EnumThing.values ​​(); 'सभी enum मान वापस कर देगा, और किसी भी प्रकार का सबसेट नहीं। तो, आप वास्तव में क्या करना चाहते हैं? थोड़ा और बताएं। सभी enum मानों से –

+0

मैं तर्क के रूप में पारित enum मान को हटा रहा हूँ, और फिर मैं शेष मूल्यों के माध्यम से लूप करना चाहता हूँ। – andersra

+0

और मैंने सोचा कि आप पहले ही जानते थे कि कैसे एक ऐरे, या संग्रह के माध्यम से लूप करना है। –

उत्तर

21

EnumSet पर देखें। विशेष रूप से,

import java.util.EnumSet; 
import static java.util.EnumSet.complementOf; 

for (EnumThing t : complementOf(EnumSet.of(thing))) { 
    ... do the work ... 
} 
+1

+1 आज कुछ नया सीख लिया। अच्छा :) –

0
public void doSomething(EnumThing thing){ 
    EnumThing[] thingValues = EnumThing.values(); 
    for(EnumThing th : thingValues){ 
     if (th != thing) { 
      doSomethingElse(th); 
     } 
    } 
} 
0

कुछ इस तरह थोड़ा बेहतर बिट मैं

public void doSomething(EnumThing thing){ 
    EnumThing[] thingValues = EnumThing.values(); 
    List<EnumThing> valuesNotPassedAsArg = Arrays.asList(thingValues); 
    valuesNotPassAsArg.remove(thing); 
    //here I would loop through all valuesNotPassAsArg and do something with them 
} 
public enum EnumThing{ 
    SOMETHING, SOMETHINGELSE, ANOTHERTHING; 
} 
3

@ मार्को के जवाब इस से बेहतर है कहेंगे है, लेकिन यह इस वैकल्पिक तरीका का पता करने के लिए उपयोगी हो सकता है ।

public static void main(String[] args) { 
    EnumThing thing = EnumThing.ANOTHERTHING; 

    List<EnumThing> list = new ArrayList<EnumThing>(Arrays.asList(EnumThing.values())); 
    list.remove(thing); 
    System.out.println(list); 
} 



public enum EnumThing{ 
    SOMETHING, SOMETHINGELSE, ANOTHERTHING; 
} 

यह बाहर प्रिंट

[कुछ, SOMETHINGELSE]

+0

धन्यवाद, मुझे दोनों समाधान पसंद हैं – andersra

1

करने के लिए, अपने शीर्षक को देखते हुए एक सीमा पुनरावृति आप

for (int i = YourEnum.___RANGE___START___.ordinal() +1; i != YourEnum.__RANGE___END___.ordinal() ; i++) { 
    YourEnumvalue = YourEnum.values()[i]; 
    //use value 
} 

या इस

करना
for (YourEnum value: EnumSet.range(YourEnum.___RANGE___START___, YourEnum.__RANGE___END___)) { 
    // use value 
} 

मैं सिर्फ एक तत्व छोड़ना चाहता हूं, तो Skip Head's solution पूरक ओएफ से बेहतर प्रदर्शन कर सकता है, जो सिंगल पुनरावृत्ति के मामले में एक ओवरकिल लगता है।

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