即使应该返回 false,循环也会返回 true

Posted

技术标签:

【中文标题】即使应该返回 false,循环也会返回 true【英文标题】:Loop returns true even when should return false 【发布时间】: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

我的逻辑有什么问题?

【问题讨论】:

***.com/questions/562894/…的可能重复 i 是不是你要查的号码在numbers 列表中? i 将是 1,2,3,4... 的数字大小,而不是 numbers 本身的值。 @ben_w 是。我必须接受整数输入的平方数 (n),从 1 到 n 是唯一的。 @novalsi 请使用这些附加详细信息编辑您的问题,以便人们在需要时更改他们的回答 @BeauGrantham 刚刚做到了。在底部。谢谢。 【参考方案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 评估时,它永远不会包含数字。

【讨论】:

以上是关于即使应该返回 false,循环也会返回 true的主要内容,如果未能解决你的问题,请参考以下文章

即使上传了文件,Laravel Input::hasFile('image') 也会返回 false

If语句在While True循环(Python)中返回False

函数返回不正确的值[重复]

即使注册成功,isRegisteredForRemoteNotifications 也会返回 false

即使进行了更改,Statement.execute() 也会返回 false

即使进程正在运行,Process.HasExited 也会返回 true?