【问题标题】:Java- Iterating backwards through Array under a conditionJava-在条件下通过数组向后迭代
【发布时间】:2015-04-19 18:25:48
【问题描述】:

因此,对于我的一个游戏模型,有一个元素数组表示为字符串“--X-X”,因此该板有 5 个框,位置为 0-4。每个“X”只能向左移动。有一个“X-Index”,所以如果我运行 getIXPosition(1),它将返回第一个 X 的位置,即 2。getXPosition(2) 将返回第二个 X 的位置,即 4。所以字符串板是“ --X-X" 但在我的代码中,它表示为一个数组,为 "00102",以便我可以跟踪 xIndex。

现在我的问题是我需要制定一个移动方法来防止第二个 x 跳过第一个 X 到位置 1 或 0。这在这个游戏中是不允许的。我认为我正确地编写了该方法,但是当我测试以确保第二个 X 不能跳过之前的任何 X 时,我的测试没有通过。

public void move(int xIndex, int newPosition) 
{
    int oldPosition = getXPosition(xIndex);

    for(int i= oldPosition - 1; i >= 0;i--) 
    {
        while (board[i] == 0 ) 
        {
            board[oldPosition] = '0'; // so this spot is open '-'
            board[newPosition] = xIndex;
        }
        throw new IllegalArgumentException("Error cannot move X to new position");  
    }
}

我做错了什么?

【问题讨论】:

  • 你总是抛出异常...?!
  • 您似乎使用了一个永远不会跳出的内部循环。顺便说一句0 != '0' 当然。
  • 如果您的条件被违反,您应该在循环中设置一个标志,然后在循环结束时测试该条件以更新您的板或引发异常。 (顺便说一句,你不需要内部循环,只需要一个 if 语句。)
  • 谢谢大家。我终于意识到我原始代码的唯一问题(不是我在这里发布的奇怪垃圾)是我在测试用例中调用了错误类型的游戏模型。 (允许跳过的宽松游戏模型与不允许跳过的严格游戏模型 - 这个 - 不允许跳过的游戏模型。)我非常沮丧,我开始尝试任何事情让它工作,但没有意识到我在测试用例中的愚蠢错误! -__-

标签: java arrays for-loop iteration


【解决方案1】:

如果您知道要移动到的位置,则无需搜索,只需移动到那里即可。

if (board[newPosition] == '0') {
   board[newPosition[ = xIndex;
   board[oldPosition] = '0';
} else {
   throw new IllegalArgumentException("Error cannot move X to new position"); 
}

注意:字符'0'不是0的值(实际上是ASCII中的48)

【讨论】:

    【解决方案2】:

    我认为代码有点缺陷。首先,我认为您不需要一直迭代到0。你应该只迭代直到你点击newPosition

    那么while 循环就没有多大意义了。我想你是在寻找if

    最后,在这种情况下,我个人不会抛出IllegalArgumentException(实际上,无论如何,你在第一次迭代之后就抛出了,所以这是另一个缺陷)。有问题的是董事会的状态,而不是争论。如果其中一个论点是否定的等等,我可能会抛出 IllegalArgumentException

    public void move(int xIndex, int newPosition) {
        int oldPosition = getXPosition(xIndex);
    
        for(int i= oldPosition - 1; i >= newPosition; i--) {
            if(board[i] == '0') {
                board[oldPosition] = '0';
                board[i] = xIndex;
                oldPosition = i;
            } else {
                //throw some custom exception; we found the other X here.
            }
        }
    }
    

    【讨论】:

      猜你喜欢
      • 2015-09-25
      • 1970-01-01
      • 1970-01-01
      • 2023-01-31
      • 1970-01-01
      • 1970-01-01
      • 2012-05-31
      • 2010-11-15
      • 1970-01-01
      相关资源
      最近更新 更多