即使应该返回 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