循环,即使应该返回false

问题描述:

我做数字的ArrayList,适当循环,即使应该返回false

private ArrayList<Integer> numbers = new ArrayList(); 

,我要检查,如果他们都是独一无二返回true。所以我有这样的代码:

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

这里我的逻辑有什么问题?

+1

http://*.com/questions/562894/java-detect-duplicates-in-arraylist –

+2

的可能的复制是'i'实际上要核对数量是否在列表中'numbers' ? 'I'将会是1,2,3,4 ......以数字的大小,而不是'数字'本身的值。 –

+0

@ben_w它是。我必须输入一个方形数(n)的整数输入,从1到n是唯一的。 – novalsi

如果列表中可以包含以上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; 
    } 
+0

完美!谢谢,我明白你的所作所为。这很好。 我使用了第一个片段,因为我必须允许用户输入,直到用户打破它,然后我必须计算他们已经投入了多少。 – novalsi

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

在将一个数字添加到checkNumbers之后,您也有一个return语句,因此在将第一个数字添加到该数字后,列表将立即超出范围。因此,在进行if评估时,它绝不会包含数字。

checkNumbers始终为空,因此第一次找到值为i的列表时,它会将该值添加到checkNumbers,然后return true

我想反过来逻辑 - 它第一次发现一个数字在列表中,并在checkNumbers,返回false。如果这从未发生,则返回true。

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

+0

对不起,编辑以反映我确实需要他们的指数。 – novalsi

您的方法返回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; 
}