2013-05-19 214 views
1

我試圖通過for循環將DTO的多個objetcs轉換爲ArrayList。一旦添加了所有對象,爲避免重複,我將ArrayList轉換爲HashSet以避免重複記錄。避免重複記錄 - HashSet

代碼片段 -

.... 

ArrayList list = new ArrayList(); 

for(....){ 
    Class factory = DTO.getClass(); 
    Object bean = factory.newInstance(); 
    list.add(bean); 
} 

return new ArrayList(new HashSet(list)); 

,但返回的ArrayList有重複的,這是我想避免的。

回答

-1

您應該直接使用接口Set的一個類。這其中避免通過定義複製

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

Set list = new HashSet(); 

for(....){ 
    Class factory = DTO.getClass(); 
    Object bean = factory.newInstance(); 
    list.add(bean); 
} 
+0

我會推薦HashSet來代替TreeSet,因爲它的速度要快很多(大多數基本操作的常量時間和日誌時間),並且也沒有要求保留元素的順序。 –

+0

當然,以前只是使用過TreeSets,所以習慣這種習慣。更改了代碼 – MatthiasLaug

+1

直接使用該集合而不是使用中間列表不會使OP的問題消失。 –

3

即使你的DTO的兩個實例包含完全相同的值,它們將被視爲由HashSet的不同。被認爲相等,dto1.equals(dto2)(和dto2.equals(dto1))必須返回true。因此,您必須重寫DTO中的Object.equals()方法以指定兩個DTO實例何時相等。當您覆蓋equals()時,您還必須覆蓋hashCode()。兩個相同的對象必須具有相同的hashCode。

請閱讀這兩種方法的文檔,如果您不知道如何實現這些方法,請使用IDE生成這兩種方法。

3

您需要重寫從Object繼承的equals和hashcode方法。 Java不知道這兩個對象是平等的,除非你告訴它要比較什麼。 Hashset類將調用您的對象的equals方法來做比較

讓我們以汽車爲例,它有兩個字段;類型和顏色。如果兩個物體是相同類型和相同顏色,則它們將被視爲相等。

如果不重寫equals方法,我們會得到錯誤的時候,我們有兩個對象是相同

public class Car { 

private String type; 
private String color; 

public Car(String type, String color) { 
    super(); 
    this.type = type; 
    this.color = color; 
} 
public static void main(String[] args) { 
    Car car1 = new Car("Suv","Green"); 
    Car car2 = new Car("Suv","Green"); 
    System.out.println(car1.equals(car2)); //false 
} 

}

在這個例子中,我們將告訴java的

我們如何想通過覆蓋等於方法比較對象

private String type; 
private String color; 

public Car(String type, String color) { 
    super(); 
    this.type = type; 
    this.color = color; 
} 
@Override 
public boolean equals(Object obj) { 
    if (this.getClass() == obj.getClass()){ 
     Car other =(Car)obj; 
     if(this.color.equals(other.color) && this.type.equals(other.type)){ 
      return true; 
     } 
    } 
    return false; 
} 
public static void main(String[] args) { 
    Car car1 = new Car("Suv","Green"); 
    Car car2 = new Car("Suv","Green"); 
    System.out.println(car1.equals(car2)); //true 
} 

運行此示例,您將變爲true。

如果你用沒有重寫的equals的對象測試一個hashset,你將在它們中都有兩個類,因爲java認爲它們是不同的對象,因爲equals返回false。用重寫的方法測試它,你將只有一個

任何時候你重寫equals也應該重寫hashCode。用你最喜歡的IDE來幫你解決這些問題。

希望這會有所幫助!