2011-12-06 57 views
1

我做數字的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://stackoverflow.com/questions/562894/java-detect-duplicates-in-arraylist –

+2

的可能的複製是'i'實際上要覈對數量是否在列表中'numbers' ? 'I'將會是1,2,3,4 ......以數字的大小,而不是'數字'本身的值。 –

+0

@ben_w它是。我必須輸入一個方形數(n)的整數輸入,從1到n是唯一的。 – novalsi

回答

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; 
    } 
+0

完美!謝謝,我明白你的所作所爲。這很好。 我使用了第一個片段,因爲我必須允許用戶輸入,直到用戶打破它,然後我必須計算他們已經投入了多少。 – novalsi

0

您正在檢查列表是否包含等於索引的值,而不是列表中的數字。您需要get()索引處的值(或使用foreach循環)。

在將一個數字添加到checkNumbers之後,您也有一個return語句,因此在將第一個數字添加到該數字後,列表將立即超出範圍。因此,在進行if評估時,它絕不會包含數字。

0

checkNumbers始終爲空,因此第一次找到值爲i的列表時,它會將該值添加到checkNumbers,然後return true

我想反過來邏輯 - 它第一次發現一個數字在列表中,並在checkNumbers,返回false。如果這從未發生,則返回true。

2

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

+0

對不起,編輯以反映我確實需要他們的指數。 – novalsi

0

您的方法返回true的原因是您在其中創建了checkNumbers,因此它是空的。不要緊,你把數字放在 - checkNumbers找不到,添加它並返回true。

嘗試用數字吸引你的checkNumbers

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

0

問題是你比較索引而不是索引值:)。

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; 
} 
相關問題