2013-01-08 20 views
9

Mam wyliczenie z 4 wartościami i mam podpis metody, który akceptuje wartość wyliczenia. Chciałbym móc coś zrobić ze wszystkimi wartościami enum nie przekazanymi jako argument do zrobienia Coś().Pętla przez podzbiór wartości wyliczeniowych

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; 
} 

Czy jest to czystszy sposób? Mam wrażenie, że pętla do pobierania elementów z tablicy thingValues ​​jest zbędna.

+1

'EnumThing.values ​​();' zwróci wszystkie wartości wyliczeniowe, a nie każdy rodzaj podzbioru. Więc co dokładnie chcesz zrobić? Proszę wyjaśnić trochę więcej. –

+0

ze wszystkich wartości wyliczeniowych Usuwam wartość wyliczenia przekazaną jako argument, a następnie chciałbym przejrzeć pozostałe wartości. – andersra

+0

Myślałem, że już wiesz, jak przechodzić przez Array lub Collection. –

Odpowiedz

21

Sprawdź w EnumSet. Konkretnie

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

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

+1 Nauczyłem się czegoś nowego dzisiaj. Nice :) –

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

Coś jak to jest trochę lepiej Powiedziałbym

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

@ odpowiedź Marko jest lepsze niż to, ale może to być pomocne wiedzieć tego alternatywnego sposobu .

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; 
} 

ten wypisuje

[coś somethingelse]

+0

dzięki, lubię oba rozwiązania – andersra

1

Patrząc na tytuł, aby iteracyjne szereg zrobić

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

czy to

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

Chciałbym tylko pominąć jeden element, a następnie Skip Head's solution może przewyższyć parametr complementOf, co wydaje się przesadą w przypadku pojedynczej iteracji.

Powiązane problemy