簡體   English   中英

即使應該返回false,循環也返回true

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM