如何比较Java中的两个对象,它们的属性中也有列表

时间:2015-02-18 15:30:36

标签: java oop comparison

public class Employee{

int empId;
String empName;
List <EmployeeAddress> empAdd;

// getters & setters

}

public class EmployeeAddress{
String city;
String state;

// getters & setters

}

现在我制作两个员工类对象,并想比较它们。我在员工类中使用了list,因为员工可以有多个地址。需要帮助

2 个答案:

答案 0 :(得分:1)

因为说“比较”并不清楚你的意思,我想你需要覆盖equals课程中的Employee方法。

首先,我建议您在SO上查看这个有趣的问题:What issues should be considered when overriding equals and hashCode in Java?

然后,根据List接口的equals方法合同:

  

如果两个列表包含相同顺序的相同元素,则它们被定义为相等。此定义确保equals方法在List接口的不同实现中正常工作。

所以你可以编写类似的代码:

@Override
public boolean equals(Object obj) {
    Employee e = (Employee) obj;
    return this.empId == e.empId && this.empName.equals(e.empName) && this.empAdd.equals(e.empAdd);
}

或者您可以为列表比较定义自定义逻辑...

答案 1 :(得分:0)

首先,我建议将List<EmployeeAddress>更改为Set<EmployeeAddress>。这有两个方面:

  1. 它将避免每个员工的地址列表中的重复地址。
  2. 这将使两名员工保持平等而不考虑地址的显示顺序,因为它们在一组中没有订单。
  3. 话虽如此,确保EmployeeAddress的equals方法也得到了很好的实现,因为Set接口将要求它在检测重复时正常工作。然后你将实现等于:

    @Override
    public boolean equals(Object obj) {
        if (this == obj) {
            return true;
        }
        if (obj == null) {
            return false;
        }
        if (!(obj instanceof Employee)) {
            return false;
        }
        Employee other = (Employee) obj;
        if (this.empAdd == null) {
            if (other.empAdd != null) {
                return false;
            }
        } else if (!this.empAdd.equals(other.empAdd)) {
            return false;
        }
        if (this.empId != other.empId) {
            return false;
        }
        if (this.empName == null) {
            if (other.empName != null) {
                return false;
            }
        } else if (!this.empName.equals(other.empName)) {
            return false;
        }
        return true;
    }
    

    EmployeeAddress类的equals方法的实现应该如下:

        @Override
    public boolean equals(Object obj) {
        if (this == obj) {
            return true;
        }
        if (obj == null) {
            return false;
        }
        if (!(obj instanceof EmployeeAddress)) {
            return false;
        }
        EmployeeAddress other = (EmployeeAddress) obj;
        if (this.city == null) {
            if (other.city != null) {
                return false;
            }
        } else if (!this.city.equals(other.city)) {
            return false;
        }
        if (this.state == null) {
            if (other.state != null) {
                return false;
            }
        } else if (!this.state.equals(other.state)) {
            return false;
        }
        return true;
    }