循环遍历枚举值的子集



我有一个包含4个值的枚举,并且我有一个接受枚举值的方法签名。我希望能够做一些没有作为参数传递给doSomething()的所有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;
}

有更干净的方法吗?我觉得从thingValues数组中获取项目的循环是多余的。

查看EnumSet。具体地说,

import java.util.EnumSet;
import static java.util.EnumSet.complementOf;
for (EnumThing t : complementOf(EnumSet.of(thing))) {
  ... do the work ...
}

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

打印出

(什么,换掉)

另一种方法是使用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

看看你的标题,要迭代一个范围你做

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的解决方案可能会优于互补,这在单次迭代的情况下似乎是多余的。

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

像这样的东西会更好一些我应该说

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

相关内容

  • 没有找到相关文章

最新更新