[英]Loop returns true even when should return false
我正在適當地制作一個數字的arylylist
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
。
我的邏輯在這里有什么問題?
您需要迭代numbers
的內容,而不是它們的索引。
如果列表可以包含多於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;
}
您正在檢查列表是否包含等於索引的值,而不是列表中的數字。 您需要get()
索引處的值(或使用foreach循環)。
在向checkNumbers
添加數字后,您還有一個return語句,因此在向第一個數字添加后,列表將立即超出范圍。 因此,當您執行if評估時,它永遠不會包含數字。
checkNumbers
始終為空,所以第一次找到列表中的i
值時,它會將該數字添加到checkNumbers
,然后return true
。
我會反轉邏輯 - 第一次找到列表中的數字並且在checkNumbers
,返回false。 如果從未發生過,請返回true。
您的方法返回true的原因是您在其中創建了checkNumbers
,因此它是空的。 你輸入數字並不重要 - 它不會在checkNumbers
找到,添加它並返回true。
嘗試使用數字來驗證您的checkNumbers
。
你創建一個新的數組;
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
。
問題是你比較索引而不是索引的值:)。
您的方法中的問題是您檢查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;
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.