枚举值的子集中循环遍历。

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数组中获取项目的循环是多余的。


1
EnumThing.values(); 将返回所有枚举值,而不是任何子集。那么,您到底想做什么?请解释得更详细一些。 - Rohit Jain
从所有枚举值中,我正在删除作为参数传递的枚举值,然后我想循环遍历剩余的值。 - andersra
我以为你已经知道如何循环遍历数组或集合了。 - Rohit Jain
所以你想要枚举列表,不包括 thing - Daniel Kaplan
6个回答

29

请查看EnumSet。具体而言,

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

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

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

这将打印出

[某些内容,其他内容]


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

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可能比complementOf更好,因为在单次迭代的情况下,complementOf似乎有些过度。


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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接