2013-03-04 53 views
2

嗨,我弄清楚爲什麼這個代碼不工作我怎麼想它的工作方式..生成對象和投入ArrayList中,沒有重複

我基本上想要的是有一個char隨機對象,一個int生成並將其放入一個數組列表中。但是,如果在arraylist中生成的匹配相同,則必須再次重新生成號碼並檢查它是否存在。如果它不存在,它將被添加到數組列表中。

private final char letter; 
    private final int num; 
    private static Collection<RegistrationNumber> REGISTRATION_NUMBER = new ArrayList<RegistrationNumber>(); 

    private RegistrationNumber(){ 
     Random rand = new Random(); 
     this.num = (1+(rand.nextInt(3))); 
     this.letter = Character.toUpperCase((char)(rand.nextInt(1)+'a')); 
    } 

    public static RegistrationNumber getInstance(){ 
     boolean foo = false; 
     RegistrationNumber rn = null; 
     while(!foo){ 
      rn = new RegistrationNumber(); 
      if(!REGISTRATION_NUMBER.contains(rn)){ 
       REGISTRATION_NUMBER.add(rn); 
       foo=true; 
      }   
     }return rn; 
    } 

有一次,我期待通過ArrayList中,仍然有一些重複,例如[A1,A1,A2]或[A2,A2,A3]

非常感謝!

+0

嘗試使用set.Is它ok – PSR 2013-03-04 14:27:30

+0

你知道什麼'包含'在做內部?你是否爲'RegistrationNumber'實現了equals?也許你應該使用'Set'而不是'List'。 – 2013-03-04 14:28:20

+0

您是否閱讀過包含方法的API文檔? – 2013-03-04 14:29:26

回答

3

爲了使contains(rn)方法起作用,RegistrationNumber必須覆蓋equals。否則,具有相同信息的兩個不同對象將不會被視爲相同。

當您覆蓋equals時,您還需要覆蓋hashCode,因爲java.Object的合同要求您同時覆蓋兩者。

最後,您可以考慮使用LinkedHashSet集合作爲您的註冊:它會爲您提供可預測的迭代順序,同時自動防止重複。當然,您仍然需要覆蓋equalshashCode

+0

謝謝!,將調查equals和hashcode覆蓋 – jonprasetyo 2013-03-04 16:46:32

0

RegistrationNumber類必須實現equals()hashCode()

我會建議先重寫這些方法,然後使用HashSet,它會給你一個不允許重複的Set。

@Override 
public int hashCode() { 
    final int prime = 31; 
    int result = 1; 
    result = prime * result + num; 
    return result; 
} 

@Override 
public boolean equals(Object obj) { 
    if (this == obj) 
     return true; 
    if (obj == null) 
     return false; 
    if (getClass() != obj.getClass()) 
     return false; 
    RegistrationNumber other = (RegistrationNumber) obj; 
    if (num != other.num) 
     return false; 
    return true; 
} 
0

的ArrayList的contains方法需要使用它告訴集合怎麼會這個對象進行比較,以現有的(因此能夠找到重複)

@Override 
public boolean equals(Object obj) { 
    if (this == obj) 
    return true; 

    if (obj == null) 
    return false; 

    if (getClass() != obj.getClass()) 
    return false; 

    final RegistrationNumber other = (RegistrationNumber) obj; 

    if (num != other.num && letter != other.letter) 
    return false; 

    return true; 
} 
0

contains方法的equals方法重載,默認情況下,使用類'equals方法。如果equals沒有被覆蓋,它就會像使用「==」運算符一樣工作。這將測試它是否是同一個對象;而不是具有相同內容的對象。

你需要做的是重寫你的RegistrationNumber類中的equals()方法,所以它測試成員相等性,而不是引用相等。