-2

我有两个对象,分别是 Employee 和 Person。他们都有名字和姓氏。如果 Person 和 Employee 的 firstName、lastName 已添加到列表中,我不想将对象(Employee 或 Person)添加到列表中。

使用equals和hashcode来做到这一点......

编辑:我不能使用 Set 或任何其他集合,必须使用 equals 和 hashcode 来实现这一点。

4

6 回答 6

1

对于 equals/hashcode 示例,您可以查看此问题。至于添加到 List,有两种选择:

  1. 每次在向其添加元素之前,检查 List 是否包含使用List.contains 方法的对象
  2. 使用LinkedHashSet,它将保存添加元素的顺序,然后返回new ArrayList<Employee>(employeeLinkedHashSet);
于 2012-12-19T14:21:41.157 回答
0

由于您想将 and 的身份结合起来EmployeePerson因此这不能轻易实现,除非您准备好

  1. Employee extends Person
  2. Employees只要它们等于s,就都等于Persons,而不管它们可能具有的任何其他属性。

如果这些约束对您来说是可以接受的,那么只需实施Person#equalsPerson#hashCode涉及firstNamelastName使用 aSet来消除重复项。

于 2012-12-19T14:15:28.277 回答
0

使用 避免重复在 Java API Doc 中阅读更多内容

于 2012-12-19T14:15:52.393 回答
0
  1. 实现一个List包装现有List实现的ArrayList
  2. 将所有方法调用委托给包装列表
  3. 实施add并且addAll如果它们已经在列表中,则它们不会添加这些值。

请注意,此实现与List接口不一致,因为用户希望调用add 真正将对象添加到集合中(大小增加一)。

最好使用Set实现(避免重复但不保留插入顺序)或在添加之前检查重复:

 List<Person> persons = getPersonsFromSomewhere();
 Person person = getAPersonThatShallBeAddedIfNotDuplicate();
 if (!persons.contains(person)) {
    persons.add(person);
 }
于 2012-12-19T14:16:04.887 回答
0

使用 aSet而不是列表。如果您需要一个列表,您可以调用Set.toArray()并将其传递给List构造函数。

你有 Employee 和 Person 类实现吗Comparable<T>?让 Employee 成为 Person 的子类可能会使这更容易。

于 2012-12-19T14:17:02.637 回答
0

如果您有一些应该是唯一的字段,我怀疑您应该使用地图。您可以使用作为复合键的自定义类,也可以使用分隔符将字符串组合成单个字符串。

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 已经有equalshashCode方法,所以你不需要添加它们。

于 2012-12-19T14:18:37.090 回答