【问题标题】:How do you compress an if statement comprised of OR operators?如何压缩由 OR 运算符组成的 if 语句?
【发布时间】:2015-02-24 17:38:24
【问题描述】:

我有一个井字棋盘,在我检查胜利条件之前,我检查存储在 board[][] 集合中的对象是否为空。

例如:

if(board[0][j] == null || board[1][j] == null || board[2][j] == null)//and so on
//do something
else
  //proceed with row evaluation

【问题讨论】:

  • 嗯,你可以使用循环......但只有三个条件,它真的有那么糟糕吗?
  • 问题是如果我使用循环,则第一个值有可能被评估为不为空并继续执行 if 的主体。我想要做的是获取一组数据,如果其中任何一个为空,则执行 else 语句。
  • 嗯,不-您使用循环来确定是否有任何值为空,然后基于此创建if 语句。仅对于三个值,这将比您当前的方法更加冗长。随着条件数量的增加,它会变得越来越有吸引力。
  • 可以IntStream.range(0, 3).mapToObj(i -> board[i][j] == null).anyMatch(i -> i)。不过,对于 3 个值来说,这并不是一个好主意。
  • @JonSkeet 我希望能够评估任何范围的值,If 语句只需要一个参数为真。但我想看看是否至少有一个值为空。

标签: java if-statement


【解决方案1】:

Board 类中添加一个方法,例如:

public boolean hasAnyNull() {
   boolean found = false;
   for (int i = 0 ; !found && i < board.width ; i++) {
      for (int j = 0; !found && j < board.height ; j++ {
         if (board[i][j] == null) {
            found = true;
         }
      }
   }
   return found;
}

并测试if (hasAnyNull()) {...}。该方法在第一个null 返回,与您的or 条件完全相同。

如果您愿意,该方法可以将板作为参数。

【讨论】:

  • 他只想测试 1 行。
  • 实际上,据我了解,它是在 full 评估胜利条件之前检查任何空值。
  • 对不起,问题的重点只是检查一行是否有空值。如果不存在-> 评估。 @AdrianLeonhard
  • 感谢您的帮助。我稍微调整了一下,但这基本上是我所缺少的。 @AbbéRésina
【解决方案2】:

没有更好的方法来进一步压缩这些内容。但是,如果您主要关心的是可读性,您可以将代码移动到私有辅助方法中,并为该方法指定一个名称,以表达您正在评估的条件。

例如

if (isVictoryCondition(...)) {
    ...
}

...

private boolean isVictoryCondition(...) { /* null check logic goes here */ }

您可以将其命名为 checkForNull(...) 之类的名称,或者您可以将其命名为更能描述您在检查这些值是否为 null 时实际查找的内容,例如isVictoryCondition(...) 如果这表示胜利条件。

【讨论】:

  • 是的,但如果我想制作任何尺寸的板,请说。我将不得不手动输入要检查的索引。我想以一种检查所有条件而不仅仅是一个条件的方式对其进行概括。
  • 您可以在私有方法中使用循环来完成此操作。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-02-22
  • 1970-01-01
  • 1970-01-01
  • 2015-06-27
  • 2014-02-17
  • 2021-06-20
相关资源
最近更新 更多