Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/394.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 循环遍历枚举值的子集_Java_Enums - Fatal编程技术网

Java 循环遍历枚举值的子集

Java 循环遍历枚举值的子集,java,enums,Java,Enums,我有一个带有4个值的枚举,还有一个接受枚举值的方法签名。我希望能够处理所有未作为doSomething()参数传递的枚举值 public void doSomething(枚举对象){ EnumThing[]thingValues=EnumThing.values(); 列表值ntpassedasorg=new ArrayList(); for(枚举对象th:对象值){ 附加值(th); } 价值拆下(东西); //在这里,我会循环使用所有的价值观,并用它们做些事情 } 公共枚举{ 某物,某物,

我有一个带有4个值的枚举,还有一个接受枚举值的方法签名。我希望能够处理所有未作为doSomething()参数传递的枚举值

public void doSomething(枚举对象){
EnumThing[]thingValues=EnumThing.values();
列表值ntpassedasorg=new ArrayList();
for(枚举对象th:对象值){
附加值(th);
}
价值拆下(东西);
//在这里,我会循环使用所有的价值观,并用它们做些事情
}
公共枚举{
某物,某物,某物;
}

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

查看
EnumSet
。具体来说,

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

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

我想说,这样会好一点

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;
}
public void doSomething(枚举对象){
EnumThing[]thingValues=EnumThing.values();
列表值ntpassedasorg=Arrays.asList(thingValues);
价值拆下(东西);
//在这里,我会循环使用所有的价值观,并用它们做些事情
}
公共枚举{
某物,某物,某物;
}

@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;
}
publicstaticvoidmain(字符串[]args){
EnumThing thing=EnumThing.ANOTHERTHING;
List List=newarraylist(Arrays.asList(EnumThing.values());
把(东西)移走;
系统输出打印项次(列表);
}
公共枚举{
某物,某物,某物;
}
这是打印出来的

[某物,某物]


查看标题,迭代一个范围

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
}

如果你只想跳过一个元素,那么它的性能可能会超过互补元素,在单次迭代的情况下,这似乎是一种过度的杀伤力

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

EnumThing.values()
将返回所有枚举值,而不是任何类型的子集。那么,你到底想做什么?请再解释一点。我正在从所有枚举值中删除作为参数传递的枚举值,然后我想循环其余的值。我还以为您已经知道如何循环数组或集合。所以您想要枚举列表,不包括
东西
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