1

我有一个用 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(),但我“不应该”使用它。这是什么意思?

4

6 回答 6

6

如果它始终是前 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
于 2013-05-20T13:43:46.947 回答
3

这很容易通过实现您自己的计数器来解决。

int counter = 0;

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

    counter++;
}
于 2013-05-20T13:38:16.113 回答
2

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

int i = 0;
for(Game.Color color : Game.Color.values())
{
    if(i++ >= numberOfColorsToUse)
        break;
    DrawRectangle(color);
}
于 2013-05-20T13:40:12.637 回答
1

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

Color stop = PINK;

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

注意:枚举是唯一可以与==.

但也许更好的方法是创建另一个数组,其中包含要迭代的颜色:

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

现在您可以遍历数组。也就是说,当您以后出于任何原因开始重新排序颜色时,这将导致奇怪的问题。这就是为什么最好命名您要使用的颜色的原因:

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

这样,很清楚您将获得哪些颜色。

于 2013-05-20T13:41:05.140 回答
1

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

于 2013-05-20T13:45:17.297 回答
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;
    }

}
于 2013-05-20T13:44:45.187 回答