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