我有两个对象,分别是 Employee 和 Person。他们都有名字和姓氏。如果 Person 和 Employee 的 firstName、lastName 已添加到列表中,我不想将对象(Employee 或 Person)添加到列表中。
使用equals和hashcode来做到这一点......
编辑:我不能使用 Set 或任何其他集合,必须使用 equals 和 hashcode 来实现这一点。
我有两个对象,分别是 Employee 和 Person。他们都有名字和姓氏。如果 Person 和 Employee 的 firstName、lastName 已添加到列表中,我不想将对象(Employee 或 Person)添加到列表中。
使用equals和hashcode来做到这一点......
编辑:我不能使用 Set 或任何其他集合,必须使用 equals 和 hashcode 来实现这一点。
对于 equals/hashcode 示例,您可以查看此问题。至于添加到 List,有两种选择:
new ArrayList<Employee>(employeeLinkedHashSet);
由于您想将 and 的身份结合起来Employee
,Person
因此这不能轻易实现,除非您准备好
Employee extends Person
和Employees
只要它们等于s,就都等于Person
s,而不管它们可能具有的任何其他属性。如果这些约束对您来说是可以接受的,那么只需实施Person#equals
并Person#hashCode
涉及firstName
并lastName
使用 aSet
来消除重复项。
使用set 接口避免重复在 Java API Doc 中阅读更多内容
List
包装现有List
实现的ArrayList
add
并且addAll
如果它们已经在列表中,则它们不会添加这些值。请注意,此实现与List
接口不一致,因为用户希望调用add
真正将对象添加到集合中(大小增加一)。
最好使用Set
实现(避免重复但不保留插入顺序)或在添加之前检查重复:
List<Person> persons = getPersonsFromSomewhere();
Person person = getAPersonThatShallBeAddedIfNotDuplicate();
if (!persons.contains(person)) {
persons.add(person);
}
使用 aSet
而不是列表。如果您需要一个列表,您可以调用Set.toArray()
并将其传递给List
构造函数。
你有 Employee 和 Person 类实现吗Comparable<T>
?让 Employee 成为 Person 的子类可能会使这更容易。
如果您有一些应该是唯一的字段,我怀疑您应该使用地图。您可以使用作为复合键的自定义类,也可以使用分隔符将字符串组合成单个字符串。
Map<String, Employee> employeeMap = ....
String fullname = employee.firstName + "~" + employee.lastName;
Employee employee = employeeMap.get(fullname);
if (employee == null) {
// not in the map so add it.
employeeMap.put(fullname, employee);
} else {
// employee is already in the collection.
// alter it or produce a warning
}
注意: String 已经有equals
和hashCode
方法,所以你不需要添加它们。