12

我有一个包含 4 个值的枚举,并且我有一个接受枚举值的方法签名。我希望能够对所有未作为参数传递给 doSomething() 的枚举值做一些事情。

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

有没有更清洁的方法来做到这一点?我觉得从 thingValues 数组中获取项目的循环似乎是多余的。

4

6 回答 6

29

调查EnumSet。具体来说,

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

for (EnumThing t : complementOf(EnumSet.of(thing))) {
  ... do the work ...
}
于 2013-01-08T21:14:36.967 回答
4

@Marko 的答案比这更好,但了解这种替代方式可能会有所帮助。

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

这打印出来

[某事,某事]

于 2013-01-08T21:24:37.477 回答
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 的解决方案可能会胜过补全,这在单次迭代的情况下似乎有点过头了。

于 2013-01-16T09:35:47.617 回答
1

另一种方法是使用Stream.of方法。例如:

public class EnumTest {

    public static enum MyEnum {
        VALUE1, VALUE2, VALUE3
    }

    public static void main(String[] args) {
        Stream.of(MyEnum.values()).filter(v -> v != MyEnum.VALUE2).forEach(System.out::println);
    }
}

哪个打印:

VALUE1
VALUE3
于 2020-04-22T23:07:04.787 回答
0
public void doSomething(EnumThing thing){
   EnumThing[] thingValues = EnumThing.values();
   for(EnumThing th : thingValues){
       if (th != thing) {
          doSomethingElse(th);
       }
   }
}
于 2013-01-08T21:14:49.447 回答
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;
}
于 2013-01-08T21:18:45.410 回答