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