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

时间:2011-12-06 16:46:40

标签: java for-loop boolean return

我正在制作数字的arraylist

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

我的逻辑出了什么问题?

8 个答案:

答案 0 :(得分:2)

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

答案 1 :(得分: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;
    } 

答案 2 :(得分:0)

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

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

答案 3 :(得分:0)

checkNumbers一开始就是空的,所以当它第一次找到列表中的i值时,它会将该数字添加到checkNumbers然后{{ 1}}。

我反转逻辑 - 第一次找到列表中的数字并且在return true中,返回false。如果这种情况从未发生过,请返回true。

答案 4 :(得分:0)

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

尝试使用数字来假设checkNumbers

答案 5 :(得分:0)

您创建一个新数组;

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

答案 6 :(得分:0)

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

答案 7 :(得分:0)

您方法中的问题是,您检查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;
}