【问题标题】:Multiple conditional if() statements in Java?Java中的多个条件if()语句?
【发布时间】:2014-11-17 17:42:10
【问题描述】:

我知道这似乎是不可原谅的罪过,但我有 150 个变量,我想创建一个 if 函数,它执行以下操作:

if(a != 0 && b != 0 && c != 0....) {
  //do this
} else {
  //do this instead
}

然而,当我设置 if 语句条件之一(即b!=1),而其他条件仍然相同(a!=0c!=0)时,else 函数仍然运行,即使它应该是初始的 //do this 而不是 //do this instead(参见上面的代码 sn-p)。

我的问题是:

1. 是否有它无法正常工作的原因,如果有,我该如何解决?
2. 有没有更简单的方法这样做而不必列出所有 150 个变量 !=0 && !=0 etc..?

干杯

【问题讨论】:

  • 如果您使用数组或集合来存储数据而不是 150 个变量,那么是的,这更容易:)。
  • 你必须包装你的数据结构。你的代码中有 150 个变量预示着灾难即将到来,我不想活着见证结果。
  • 这只是意味着b 条件不是产生false 语句的条件。也许你想要“或”而不是“和”?
  • 至于你的错误,你是说当你的变量之一不为0时,else语句运行?那是因为你使用 &&。所有这些都必须是真实的才能通过。如果您希望它在只有一个为真时通过,请使用 ||。
  • 我看到 cobertura 抱怨分支覆盖率......

标签: java if-statement


【解决方案1】:

当然,这样做会更简单:

List<Integer> values = new ArrayList<Integer>();

values.add(val1);
values.add(val2);
// And so forth...

boolean pass = true;

for (Integer v : values) {
    if (v != 0) {
        pass = false;
        // You could log which variable failed here...
    }
}

if (pass) {
    // Do something
} else {
    // Do something else
}

【讨论】:

    【解决方案2】:

    带有一个数组、一个循环和一个布尔值。检查你的数组......很有可能......你的老师不会让你创建 150 个整数变量。

    int[] integers = new int[150];
    integers[0] = 1; // Set your like 150 variables like this
    integers[1] = 2; 
    
    boolean isAllNotZero = false;
    
    for(int i = 0; i < integers.length - 1; i++) {
       if(integers[i] != 0) {
         boolean isAllNotZero = true;
       }
    }
    
    if(isAllNotZero) {
      // Do something 
    } else {
      // Do something else
    }
    

    【讨论】:

    • 如果这只是一个学校项目 :)- 我在自己的时间做这件事是出于我自己的兴趣。但是,您的解决方案很有趣
    • 向你致敬。确保你了解数组!
    • 你的逻辑是倒退的(给定你的变量名)。并且,如果有人正在测试 not allZero,最好在达到该条件时离开循环(为什么要在找到密钥后查找它们)
    • 下一个建议,不要使用否定逻辑 - 你稍后会感谢我(boolean isAllZero = true; 设置为 false 当 integer[x] 不为零然后从循环中中断 - 仍然不需要保留发现异常时处理)
    【解决方案3】:

    1) 我不太确定“设置 if 语句条件之一”是什么意思。但是,如果您的意思是与 b 相关的测试评估为真,而其他测试仍然与假相关,那么该行为是有意的。您正在使用逻辑与 &amp;&amp; 来加入您的条件。这意味着当且仅当所有单个条件都为真时,整体条件为真。

    如果您希望在任何个条件为真时执行第一个块,那么您应该使用 OR (||) 来代替。

    2) if 语句总是需要一个布尔条件——在这种情况下,您是由 150 个单独条件的组合形成的。如果您需要检查 150 个字段以做出总体决策,那么不知何故这些都需要被访问。

    但是,您也许可以让自己更轻松。一方面,如果ab 等是对象的一部分,那么您可以提供一个很好的公共方法来描述条件,并隐藏令人讨厌的细节(例如public boolean isReadyToExecute()) .

    另外,如果您有 150 个变量,那么它们很可能都是同一类事物的实例。例如,您正在跟踪 150 个文件以查看它们是否已生成。而不是像这样的变量:

    private boolean fileReady1;
    private boolean fileReady2;
    // ...
    private boolean fileReady150;
    

    您可以使用数组(或其他集合)来代替:

    private boolean[] filesReady = new boolean[150];
    

    现在您不必手动拼出每个变量,即可得出布尔条件:

    public boolean isReadyToLoad() {
       for (int i = 0; i < filesReady.length; i++) {
           if (!filesReady[i]) {
               // Found a file that wasn't ready, so we're not ready overall
               return false;
           }
       }
       // Got through all the files without finding an unready one
       return true;
    }
    

    具体方法取决于您的问题的性质。但我认为信息隐藏(即用好的方法包装东西)和循环的某种组合将涵盖您需要做的任何事情。

    (并且不要忘记在方法中包装的东西可以嵌套。也许前 20 个字段代表一组东西,接下来的 30 个字段代表另一组,等等。然后你可以包装每个 这些 在一个方法中,并将isReadyToLoad() 实现为allFilesLoaded() &amp;&amp; status.isSignedOff() &amp;&amp; userDao.allUsersHavePasswords()...)

    【讨论】:

      【解决方案4】:

      您可以通过stream 进行操作。

      List<Integer> vars = new ArrayList<>();
      vars.add(a);
      vars.add(b);
      
      if (vars.stream().noneMatch(v -> v == 0)) {
         // No variable = 0. Do something
      } else {
         // Do something
      }
      

      【讨论】:

        【解决方案5】:

        如果不了解有关您的解决方案的更多详细信息,很难说。 Karnaugh map 可能会对您有所帮助。

        【讨论】:

        • -1 从我这边---啊,来人为 150 个变量实现 K-map...你甚至为超过 6 个变量做过吗???
        • 只需填写 22500 个字段^_^
        • 如果使用 K-map,可能不需要 150 个变量。这是基于模糊问题描述的建议。
        • @JeffMiller-所以,你写了一篇新的研究论文,将 150 个变量的函数的 K-map 实现为更少的东西,嗯???似乎比解决NP vs P 问题更难!
        猜你喜欢
        • 2021-08-16
        • 2015-01-20
        • 2013-12-17
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2017-09-25
        • 1970-01-01
        • 2013-11-17
        相关资源
        最近更新 更多