避免重复记录 - HashSet

时间:2013-05-19 09:21:26

标签: java java-ee arraylist hashset

我正在尝试通过ArrayList循环将多个对象DTO转换为for。添加完所有对象后,为了避免重复,我将ArrayList转换为HashSet以避免重复记录。

代码段 -

....

ArrayList list = new ArrayList();

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

return new ArrayList(new HashSet(list));

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

3 个答案:

答案 0 :(得分:3)

即使DTO的两个实例包含完全相同的值,HashSet也会认为它们不同。为了被认为是平等的,dto1.equals(dto2)(和dto2.equals(dto1))必须返回true。因此,您必须覆盖DTO中的Object.equals()方法,以指定两个DTO实例何时相等。当您覆盖equals()时,您还必须覆盖hashCode()。两个相等的对象必须具有相同的hashCode。

阅读这两种方法的文档,如果您不知道如何实现它们,请使用IDE生成这两种方法。

答案 1 :(得分:3)

您需要覆盖从Object继承的equals和hashcode方法。 Java不知道这两个对象是否相等,除非你告诉它要比较什么。 Hashset类将调用对象的equals方法来进行比较

让我们以汽车为例,它有两个领域;类型和颜色。如果两个对象的类型和颜色相同,则视为相等。

如果我们不覆盖equals方法,当我们有两个相同的

对象时,我们将得到false
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
}

}

在这个例子中,我们将通过重写equals方法告诉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
}

运行这个例子你就会成真。

如果你测试带有没有被覆盖的equals的对象的hashset,你将会有两个类,因为java认为它们是不同的对象,因为equals返回false。使用重写方法测试它,你将只有一个

同样,只要你重写equals,你也应该覆盖hashCode。使用您最喜欢的IDE来帮助您解决这些问题。

希望这有帮助!

答案 2 :(得分:-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);
}