2013-02-21 72 views
1

我有一個保存信息的類的ArrayList,我想將對象添加到此列表中。我想查看該列表是否已經包含一個數字,然後將其添加到列表中。檢查類的ArrayList是否有重複記錄

通常情況下,如果它只是一個字符串列表,我只想做這樣的事情

if(!list.contains("this string")){ 
    list.add("this string"); 
} 

但由於這是一類,它有每個索引多個變量。

類世界的一個例子是這樣的:

private class From{ 
    private long threadID; 
    private long date; 
    private String address; 
    private String body; 
    private int type; 
    private long id; 

    @Override 
    public boolean equals(Object obj){ 
     if(obj != null){ 
      if(getClass() != obj.getClass()){ 
       return false; 
      }else{ 
       final From from = (From)obj; 
       if((this.address != null) ? (from.address != null) : !this.address.equals(from.address)){ 
        return false; 
       } 
      } 
     }else{ 
      return false; 
     } 
     return true; 
    } 
} 

我想看看是否已經有相同數量的條目,所以我要去通過各項指標必須手動循環和檢查,或者是否有更簡單的方法來做我想做的事情?

編輯:

我怎麼稱呼它

HashSet<From> addresses = new HashSet<From>(); 
From f = new From(); 
       f.setAddress(messages.getString(3)); 
       f.setBody(messages.getString(0)); 
       f.setDate(messages.getLong(2)); 
       f.setThreadId(messages.getLong(1)); 
       f.setType(1); 
       if(!addresses.contains(f.address)){ 
        addresses.add(f); 
       } 
+0

考慮使用'Map' – 2013-02-21 18:13:10

回答

1

您必須覆蓋equals(Object o)這一點。這是您需要定義將定義兩個對象之間的相等性的邏輯的地方。

重寫hashCode()也是一種很好的做法。閱讀更多關於Object的Javadocs。

4

使用Set而不是List。設置不允許重複

http://docs.oracle.com/javase/6/docs/api/java/util/HashSet.html

您還需要重寫等於在你的類,以便設置知道,如果兩個對象相等

忽略equals的

例子可以在這裏找到:How to override equals method in java

+0

這是最好的解決方案 – user1428716 2013-02-21 17:35:23

+0

我在我的Info類中覆蓋了equals,但是當我在代碼中放置一個斷點時它永遠不會被調用。我編輯我的問題,包括更多的代碼與我的電話和我的覆蓋 – tyczj 2013-02-21 18:27:35

+0

...也重寫hashCode()時使用HashSet – keuleJ 2013-02-21 20:35:51

1

另一種方法是override equals()信息對象,如果兩個Info對象都具有相同的編號,則兩個Info對象相等。在將元素添加到列表中之前,只需執行equals()測試。

0

您仍然可以使用contains方法; A List使用equals方法確定項目是否存在於列表中。但是您必須在您的Info對象中覆蓋equals