1

假设我有一个名为 Customer 的实体和一个名为 CustomerMapper 的帮助器类,它从表单中获取值。然后我将这个 CustomerMapper 发送到服务层,在那里我从 getter 中提取值并将新客户添加到数据库中。

但是现在我需要遍历 aList<Customer>并检查 customerID 是否包含在另一个ArrayList<CustomerMapper>. 我读到 .contains() 方法在元素上调用 .equals() 。所以我想知道在 Customer 上实现 equals() 是否正确,我将发送一个 CustomeMapper 类型的对象,我会将 customer.getId() 与 customerMapper.customerId() 进行比较。

如果答案是否定的,请详细说明为什么会这样。

编辑:

这就是我想出的。我已经遍历了两个 arralists 并创建了Map<Long, Customer>and Map<Long, CustomerMapper>. 基本上我需要删除所有 ID 不包含在Map<Long, CustomerMapper> 中的客户。现在我迭代Map<Long, Customer>并调用Map<Long, CustomerMapp>.contaisKey(currentElement).这是一个很好的解决方案,因为这样我就有了三个 for 循环。

4

5 回答 5

5

通过实现一个方法来做到这一点是没有意义的equals(),因为这两个对象不相等。

只需提取id并检查是否CustomerMapper有相同的。

于 2012-09-30T10:57:50.667 回答
2

不,您应该只实现equals返回true相等的对象。研究 Javadoc equals,特别是它强加的关系必须具备哪些属性,例如对称性、传递性和反射性。我认为您的预期实施至少会在前两个上失败,也许也是最后一个。您只需要编写一个显式循环来测试您的标准的所有成员。

关于您当前的解决方案:

使用地图是不是有点矫枉过正?我建议简单地将ids 从CustomerMappers 收集到 aHashSet中,并在 s 上的过滤循环中使用该集合Customer。顺便说一句,您使用的想法equals 不会降低时间复杂度;循环只会隐藏在contains方法调用后面,导致总复杂度为 O(n 2 )。由于 O(1) 哈希查找,使用 Set/Map 的解决方案实际上不太复杂:整体复杂度仅为 O(n)。

于 2012-09-30T10:57:49.573 回答
1

我不会这样做的。想想集合的任何其他用途,例如java.util.Set. 您可以运行以下代码:

Set<Object> customerLikeObjects = new HashSet<Object>();
customer.add(new CustomerMapper(13));

if (customer.contains(new Customer(13))) {
    // Run some code
}

该条件应检查 ID 为 13 的客户是否已在集合中,然后运行一些代码。但实际上,Set 并不包含客户,而是一些“相似”的对象。事实上,您甚至可能不会将这两种对象类型混合在一个集合中,对吗?

虽然这个“聪明”的解决方案似乎可以解决您的问题,但最终会非常令人困惑。事实上,任何“聪明”但不知何故感觉不对的东西总是一个非常糟糕的主意。

于 2012-09-30T10:58:58.560 回答
1

由于“等于”方法签名看起来像public boolean equals(Object that)您可以实现任何类型的对象之间的比较。可能你必须添加类似的东西

if (that instanceof CustomerMapper){
//do your comparison here
}

在您的方法实现中。

instanceof不过,这是一个相当缓慢的过程。

于 2012-09-30T10:59:31.237 回答
1

以这种方式覆盖 equals 是“错误”的原因是它会破坏equals 的一般合同,并可能导致奇怪的、微妙的(或奇怪的、明显的)错误

如果您查看ArrayList contains() 的源代码,则会调用 indexOf() 来迭代列表。因此,您自己编写比较方法不会对性能造成影响(并且可以说它更具可读性)。

假设 Customer 和 CustomerMapper 都有一个getId()方法

public Boolean containsCustomer(List<CustomerMapper> customerMappers, Customer customer) {
  if (customer == null  || customerMappers == null || customerMappers.size() == 0) {
    return false;
  } 
  for (int i = 0; i < customerMappers.size(); i++) {
    if (customer.getId().equals(customerMappers[i].getId())) {
     return true;
    }
  }
  return false;
}
于 2012-09-30T11:09:20.190 回答