循环遍历java中枚举的子集

时间:2013-05-20 13:35:44

标签: java enums

我有一个用9种颜色准备的枚举。但对于程序的给定运行,我想循环遍历n个第一个值。我怎么能以最好的方式做到这一点。我遇到的一个问题是我无法将Color与int进行比较。

public enum Color{WHITE, YELLOW, GREEN, TEAL, BLUE, PURPLE, PINK, ORANGE, BLACK}
private int numberOfColorsToUse = 6;

不起作用的循环:

for(Game.Color color : Game.Color.values())
{
    if(!(color < numberOfColorsToUse))
        break;
    DrawRectangle(color);
}
编辑:我读过ordinal(),但我“不应该”使用它。这是什么意思?

6 个答案:

答案 0 :(得分:4)

如果它始终是前6种颜色,则可以使用枚举的序数。

for(Game.Color color : Game.Color.values())
{
    if(!(color.ordinal() < numberOfColorsToUse))
        break;
    DrawRectangle(color);
}

更好的方法是使用EnumSet准确指定所需的颜色:

EnumSet.of(WHITE, YELLOW, GREEN, TEAL, BLUE, PURPLE);

在更改枚举中的排序时避免出现奇怪的行为。

或者如果你想要一个范围:

EnumSet.range(WHITE,PURPLE) //has all elements from WHITE to PURPLE

答案 1 :(得分:3)

通过实施自己的计数器可以轻松解决这个问题。

int counter = 0;

for(Game.Color color : Game.Color.values())
{
    if(counter >= numCoulours)
        break;
    DrawRectangle(color);

    counter++;
}

答案 2 :(得分:2)

引入新计数器并在每次迭代中增加它:

int i = 0;
for(Game.Color color : Game.Color.values())
{
    if(i++ >= numberOfColorsToUse)
        break;
    DrawRectangle(color);
}

答案 3 :(得分:1)

使用枚举,更好的方法是使用“停止颜色”而不是“停止索引”:

Color stop = PINK;

for(Game.Color color : Game.Color.values())
{
    if(color == stop)
        break;
    DrawRectangle(color);
}

注意:枚举是唯一可以安全地与==进行比较的Java对象。

但也许更好的方法是使用您想要迭代的颜色创建另一个数组:

private Color[] subset = Arrays.copyOfRange( Color.values(), 0, 6 );

现在你可以迭代数组了。也就是说,当您因任何原因开始重新排序颜色时,这将导致奇怪的问题。这就是为什么命名你想要使用的颜色通常更好:

private Color[] subset = { Color.WHITE, Color.YELLOW, Color.GREEN, Color.TEAL, Color.BLUE, Color.PURPLE };

这样,很明显你会得到哪种颜色。

答案 4 :(得分:1)

另一件事:enum 应该 static,或者 应该引用Game的实例,而不是Game本身,访问枚举。 虽然我可能错了;毕竟,如果它编译,类访问的东西不会是那么错。

答案 5 :(得分:0)

除了反制方法之外,如果您可以使用Color指定一个数字,那么此方法也可以使用:

void iterateFirstN(int n)
{
    Color[] vals = Color.values();
    for (Color v : vals)
    {
        if(v.num() >= n)
            break; //or return
    }
}

public enum Color {
    WHITE(1), YELLOW(2), GREEN(3), TEAL(4), BLUE(5), PURPLE(6), PINK(7), ORANGE(8), BLACK(9);

    int colorNum;
    Color(int num)
    {
        colorNum = num;
    }

    int num()
    {
        return colorNum;
    }

}