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 配列からアイテムを取得するためのループが不要であるかのように感じます。

4

6 に答える 6

29

を調べEnumSetます。具体的には、

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

for (EnumThing t : complementOf(EnumSet.of(thing))) {
  ... do the work ...
}
于 2013-01-08T21:14:36.967 に答える
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;
}

これは印刷されます

[何か、何か]

于 2013-01-08T21:24:37.477 に答える
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のソリューションはcomplementOfよりも優れている可能性があります。これは、単一の反復の場合にはやり過ぎのようです。

于 2013-01-16T09:35:47.617 に答える
0
public void doSomething(EnumThing thing){
   EnumThing[] thingValues = EnumThing.values();
   for(EnumThing th : thingValues){
       if (th != thing) {
          doSomethingElse(th);
       }
   }
}
于 2013-01-08T21:14:49.447 に答える
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;
}
于 2013-01-08T21:18:45.410 に答える