2013-01-08 2 views
9

Tôi có enum với 4 giá trị và tôi có chữ ký phương thức chấp nhận giá trị enum. Tôi muốn để có thể làm một cái gì đó với tất cả các giá trị enum không được thông qua như là đối số để doSomething().Lặp qua một tập con của một giá trị 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; 
} 

Có cách nào khác để làm điều này không? Tôi cảm thấy như thể vòng lặp để lấy các mục từ mảng thingValues ​​là thừa.

+1

'EnumThing.values ​​();' sẽ trả về tất cả các giá trị enum và không phải bất kỳ loại tập con nào. Vì vậy, chính xác những gì bạn muốn làm gì? Xin giải thích thêm một chút. –

+0

từ tất cả các giá trị enum Tôi loại bỏ giá trị enum được chuyển làm đối số, và sau đó tôi muốn lặp qua các giá trị còn lại. – andersra

+0

Và tôi nghĩ bạn đã biết cách lặp qua một mảng hoặc Bộ sưu tập. –

Trả lời

21

Nhìn vào EnumSet. Cụ thể,

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

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

+1 Đã học được điều gì đó mới mẻ hôm nay. Nice :) –

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

Something như thế này là tốt hơn một chút tôi muốn nói

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

@ câu trả lời Marko là tốt hơn so với điều này, nhưng nó có thể là hữu ích để biết cách lựa chọn này .

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

này in ra

[SOMETHING, SOMETHINGELSE]

+0

cảm ơn, tôi thích cả hai giải pháp – andersra

1

Nhìn vào tiêu đề của bạn, để lặp một loạt bạn làm

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

hoặc

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

Tôi chỉ muốn bỏ qua một phần tử duy nhất, sau đó Skip Head's solution có thể hoạt động tốt hơn so với bổ sungOf, dường như là quá mức cần thiết trong trường hợp lặp lại đơn.