【问题标题】:While finding elements on an array when should I make an else?在数组上查找元素时,我应该什么时候做一个 else?
【发布时间】:2017-09-25 05:37:47
【问题描述】:

我正在使用带有计数器的 while 循环来查找数组中的元素。我将检查返回的元素是否等于数组的长度,是否找不到该元素。循环是这样的。

    int i = 0;
    int returned;
    boolean found = false;
    while(i < words.length && !found){
        WordInText check = new WordInText(w);
        if(check.equals(words[i])){
            found = true;
        }
        else{
            i++;
        }
   return i

我想知道是否会更好,而不是在每个条件下都执行 else 来执行以下操作

int i = 0;
    int returned;
    boolean found = false;
    while(i < words.length && !found){
        WordInText check = new WordInText(w);
        if(check.equals(words[i])){
            found = true;
        }
        i++;
   }
   if(!found)
        i++;
   return i-1

我觉得第二个更有效,因为它不必检查每个循环的条件,如果数组真的很长,它就必须做很多。但我不确定何时决定每一个,因为第二个看起来真的很难看而且不直观。

【问题讨论】:

  • 更好的方法是使用HashSet&lt;String&gt;
  • 什么是wWordInText
  • 我问他们是什么,你说“是”...
  • @user1803551 抱歉。它是一个字符串

标签: java loops while-loop return


【解决方案1】:

有多种可能的重构可以避免这个问题,但我会尽量按原样回答你的问题:

  • else 没有任何成本:它只是一个块,当且仅当if 的条件评估为false 时才会执行。
  • 任何人都容易理解

即使它看起来不是最漂亮的,我也没有理由避免它。在您的第二个代码中,您不仅引入了额外的指令,而且还难以理解,因为您必须了解为什么在找不到元素时需要增加索引。

【讨论】:

    【解决方案2】:

    提取方法中的代码,像这样

    public int contains(....) {
      int i = -1;
      while(i < words.length){
         WordInText check = new WordInText(w);
         if(check.equals(words[i])){
             return i;
         }
       i++;
      }
     return i;
    }
    

    不需要额外的变量和更清晰的代码结构

    【讨论】:

      【解决方案3】:

      我认为您不需要使用 else 部分或另一个 if 条件来检查是否找到它,因为您已经在 while 循环中检查条件。

      int i = 0;
      int returned;
      boolean found = false;
      while(i < words.length && !found){
          WordInText check = new WordInText(w);
          if(check.equals(words[i])){
              found = true;
          }
          i++;
      }
      return i;
      

      所以这里循环将继续直到 found 的值变为真(意味着直到找到所需的元素。然后在下一次迭代中它将检查找到的值是否为假。因为它不再是假的循环不会被执行并且 i 将被返回。 在那里您可以检查 i 的值并决定是否找到该元素。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2012-06-28
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-09-13
        • 1970-01-01
        • 2016-05-09
        • 2010-12-30
        相关资源
        最近更新 更多