有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

java循环遍历枚举值的子集

我有一个带有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数组获取项目的循环是多余的


共 (6) 个答案

  1. # 1 楼答案

    我想说,这样会好一点

    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;
    }
    
  2. # 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
    
  3. # 3 楼答案

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

    查看EnumSet。具体来说,

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

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

    这是打印出来的

    [SOMETHING, SOMETHINGELSE]

  6. # 6 楼答案

    查看标题,迭代一个范围

    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,这在单次迭代的情况下似乎是过分了