如何在java中循环遍历一组变量赋值的枚举值

时间:2013-11-06 03:06:16

标签: java enums

我正在学校开展一个项目。我发现了很多循环枚举值的方法,但是在我的所有搜索中,我都没有找到一种方法来循环一组包含枚举值的变量。

某些背景:该项目是TicTacToe游戏。我们获得了枚举和一组我们需要创建的方法来完成项目。我们不允许更改方法签名,并且必须使其在提供的构造中工作。我们也限于目前为止我们在课堂上学到的东西,这意味着列表地图和数组不是一个选项。枚举包含3个值 - X,O和EMPTY。然后我们有9个变量代表游戏板上的9个位置。

    public enum Marker
{
    EMPTY,
    X,
    O
};

private static Marker position1 = Marker.EMPTY;
private static Marker position2 = Marker.EMPTY;
private static Marker position3 = Marker.EMPTY;
private static Marker position4 = Marker.EMPTY;
private static Marker position5 = Marker.EMPTY;
private static Marker position6 = Marker.EMPTY;
private static Marker position7 = Marker.EMPTY;
private static Marker position8 = Marker.EMPTY;
private static Marker position9 = Marker.EMPTY;

private static Marker turn = Marker.X;

我正在研究一种检查是否存在平局的方法。所以,我需要遍历位置变量并测试每个变量!= Marker.EMPTY。我准备写一个巨大的条件声明,虽然我确信它会起作用,但必须有一个更好的方法。经过大约半小时的搜索 - 我在这里。任何帮助将不胜感激。

3 个答案:

答案 0 :(得分:0)

如果你真的不能使用任何类型的集合,你可能想要使用一些布尔运算符。即,类似以下内容。如果没有任何职位是Marker.EMPTY,则董事会已满,因此您只需返回position1 != Marker.EMPTY && position2 != Marker.EMPTY && ...;即可。它并不是那么漂亮,但它仍然比大if/else if/.../else块更简洁。

private static boolean isBoardFull() {
  return position1 != Marker.EMPTY &&
         position2 != Marker.EMPTY &&
         position3 != Marker.EMPTY &&
         position4 != Marker.EMPTY &&
         position5 != Marker.EMPTY &&
         position6 != Marker.EMPTY &&
         position7 != Marker.EMPTY &&
         position8 != Marker.EMPTY &&
         position9 != Marker.EMPTY ;
}

你也可以把它写成“如果不是某个位置是空的,那么董事会已经满了”:

private static boolean isBoardFull() {
  return !( position1 == Marker.EMPTY ||
            position2 == Marker.EMPTY ||
            position3 == Marker.EMPTY ||
            position4 == Marker.EMPTY ||
            position5 == Marker.EMPTY ||
            position6 == Marker.EMPTY ||
            position7 == Marker.EMPTY ||
            position8 == Marker.EMPTY ||
            position9 == Marker.EMPTY );
}

如果有其他可用的东西,有一些选项会更合适。例如,您可以在包含位置的数组上使用for循环? (你实际上可以使用一个数组,或任何实现Iterable的东西。)例如,如果你仍然需要九个变量:

private static Marker position1 = Marker.EMPTY;
private static Marker position2 = Marker.EMPTY;
private static Marker position3 = Marker.EMPTY;
private static Marker position4 = Marker.EMPTY;
private static Marker position5 = Marker.EMPTY;
private static Marker position6 = Marker.EMPTY;
private static Marker position7 = Marker.EMPTY;
private static Marker position8 = Marker.EMPTY;
private static Marker position9 = Marker.EMPTY;
private static Marker positions[] = new Marker[] { position1, position2, position3,
                                                   position4, position5, position6,
                                                   position7, position8, position9 };

private static boolean isBoardFull() {
  for ( Marker position : positions ) {
    if ( position == Marker.EMPTY ) {
      return false;
    }
  }
  return true;
}

理想情况下,你不会有九个变量,并且你想要的东西不需要事先知道位置的数量,你只需要使用数组(或其他Iterable,可能是ordered Collection):

private static Marker positions[9];
static { 
  for ( int i=0; i < positions.length; i++ ) {
    positions[i] = Marker.EMPTY;
  }
}

更好的是,如果你可以使用像List这样的Collection,你甚至不需要编写迭代,你只需要使用Collection.contains

private static List<Marker> positions = /* ... */;

private static boolean isBoardFull() {
  return !positions.contains( Marker.EMPTY );
}

答案 1 :(得分:0)

如果你有一个包含9个Marker对象的数组,或者甚至是3 x 3 Marker对象的2维数组,你就可以遍历它们。

否则你可以使用反射来查找Marker类型的所有变量,但这可能超出了你的范围。

答案 2 :(得分:0)

没有9个单独的位置变量。有一个大小为9的数组。

private Marker positions = new Marker[9]; 

...

然后才使用它们 -

Arrays.fill(positions,Marker.EMPTY);

...

以后

for (Marker position : positions) {
   ...
}