【问题标题】:Loop returns true even when should return false即使应该返回 false,循环也会返回 true
【发布时间】:2012-01-14 06:31:11
【问题描述】:

我正在适当地制作一个数字数组列表

private ArrayList<Integer> numbers = new ArrayList();

我必须检查它们是否都是独一无二的。所以我有这个代码:

public boolean isUnique()
{
    ArrayList<Integer> checkNumbers = new ArrayList();

    for(int i = 1; i<=numbers.size(); i++)
    {
        if(numbers.contains(i) && !checkNumbers.contains(i))
        {
            checkNumbers.add(i);
            return true;
        }           
    }

    return false;
}

我的想法是,我必须接受一个平方数 (n) 的整数输入,这在 1 to n 中是唯一的。

但无论我向数字 (13 2 13 2) 添加什么,它总是返回 true

我的逻辑有什么问题?

【问题讨论】:

  • i 是不是你要查的号码在numbers 列表中? i 将是 1,2,3,4... 的数字大小,而不是 numbers 本身的值。
  • @ben_w 是。我必须接受整数输入的平方数 (n),从 1 到 n 是唯一的。
  • @novalsi 请使用这些附加详细信息编辑您的问题,以便人们在需要时更改他们的回答
  • @BeauGrantham 刚刚做到了。在底部。谢谢。

标签: java for-loop boolean return


【解决方案1】:

您的方法中的问题是您检查i 的每个值是否在ArrayList 中。你要做的是使用get(),所以你必须这样做:

public boolean isUnique()
{
    ArrayList<Integer> checkNumbers = new ArrayList();

    for(int i = 1; i<=numbers.size(); i++)
    {
        if(numbers.contains(checkNumbers.get(i)) && !checkNumbers.contains(numbers.get(i)))
        {
            checkNumbers.add(i);
            return true;
        }           
    }

    return false;
}

【讨论】:

    【解决方案2】:

    如果列表可以包含比 n 更多的数字,并且您只想验证 1 .. n 都存在且没有重复,那么您的代码应修改为:

    public boolean isUnique()
    {
        ArrayList<Integer> checkNumbers = new ArrayList();
    
        for(int i = 1; i<=numbers.size(); i++)
        {
            if(numbers.contains(i))
            {
               if (!checkNumbers.contains(i)) 
                 checkNumbers.add(i);
               else 
                return false; 
            }
            else{
                return false;
            }           
        }
    
        return true;
    }
    

    另一方面,如果列表不能包含超过 n 个元素,则根本不需要另一个列表:

    public boolean isUnique()
        {
    
         if (numbers.size()<n)
            return false;  
    
            for(int i = 1; i<=numbers.size(); i++)
            {
                if(!numbers.contains(i))
                  return false; 
    
            }
    
            return true;
        } 
    

    【讨论】:

    • 完美!谢谢你,我看到你做了什么。这是极好的。我使用了第一个 sn-p,因为我必须允许用户输入,直到用户打破它,然后我必须计算他们输入的数量。
    【解决方案3】:

    问题是您比较索引而不是索引处的值:)。

    【讨论】:

      【解决方案4】:

      你创建一个新数组;

      ArrayList<Integer> checkNumbers = new ArrayList();
      

      然后在循环中执行此操作;

      if (numbers.contains(i) && !checkNumbers.contains(i))
      {
         checkNumbers.add(i);
         return true;
      } 
      

      !checkNumbers.contains(i)始终为真;你刚刚创建了它;它是空的。所以第一次numbers.contains(i)true 方法会返回true

      【讨论】:

        【解决方案5】:

        您的方法返回 true 的原因是您在其中创建了 checkNumbers,因此它是空的。输入数字无关紧要 - 它不会在 checkNumbers 中找到,添加它并返回 true。

        尝试用数字来表示您的checkNumbers

        【讨论】:

          【解决方案6】:

          您需要迭代numbers 的内容,而不是它们的索引。

          【讨论】:

          • 抱歉,已编辑以反映我确实需要他们的索引。
          【解决方案7】:

          checkNumbers 一开始总是空的,所以当它第一次在列表中找到 i 的值时,它会将该数字添加到 checkNumbers,然后添加到 return true

          我会反转逻辑 - 第一次找到列表中的数字 AND 在checkNumbers 中,返回 false。如果这永远不会发生,则返回 true。

          【讨论】:

            【解决方案8】:

            您正在检查列表是否包含等于索引的值,而不是列表中的数字。您需要 get() 索引处的值(或使用 foreach 循环)。

            在将数字添加到checkNumbers 后,您也有一个返回语句,因此在您添加第一个数字后,列表将立即超出范围。因此,当您进行 if 评估时,它永远不会包含数字。

            【讨论】:

              猜你喜欢
              • 1970-01-01
              • 1970-01-01
              • 2010-11-02
              • 2011-01-18
              • 2019-03-29
              • 2014-10-21
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              相关资源
              最近更新 更多