首页 > 解决方案 > 如何有效地比较两个产品列表

问题描述

我正在尝试编写一种方法,以有效的方式检查 2 个产品列表是否相等。

List<Product> firstList = getProductsListFromSomewhere();
List<Product> secondList = getProductsListFromSomewhereElse();

public boolean areListsEqual(List<Product> firstList, List<Product> secondList) {
    ...
}

约束和条件

要求和偏好

我的(无效:()方法
我开始写一个可能的解决方案的草案,但我发现我的方法有不同的障碍,我不知道我是否应该以某种方式改进它或完全重新考虑它。
我的想法是在应该执行比较的类中扩展 Product 类:

List<Product> firstList = getProductsListFromSomewhere();
List<Product> secondList = getProductsListFromSomewhereElse();

public boolean areListsEqual(List<Product> firstList, List<Product> secondList) {
    ...
}  

private class ComparableProduct extends Product {

  @Override
  public boolean equals(Object obj) {
    if (this == obj) {
      return true;
    }
    if (obj == null) {
      return false;
    }
    if (getClass() != obj.getClass()) {
      return false;
    }
    final ComparableProduct other = (ComparableProduct)obj;
    if (!Objects.equals(this.name, other.name)) {
      return false;
    }
    if (!Objects.equals(this.quantity, other.quantity)) {
      return false;
    }
    if (!Objects.equals(this.discountList, other.discountList)) {
      return false;
    }
    return true;
  }

  @Override
  public int hashCode() {
    int hash = 3;
    hash = 79 * hash + Objects.hashCode(this.name);
    hash = 79 * hash + Objects.hashCode(this.quantity);
    hash = 79 * hash + Objects.hashCode(this.discountList);
    return hash;
  }
}

这种方法显然不起作用,因为在没有定义 equals 和 hashCode 方法的情况下比较了 Discount 对象,但我不能扩展 Discount,因为 Product 对象中定义的 discountList 是 Discount 类型,所以我不能使用最终创建的 ComparableDiscount。
此外,一旦定义了散列机制,我不确切知道使用什么是最好的方式/数据结构,以检查两个列表是否相等

你能帮我以最好的方式完成这部分代码吗?

标签: javaalgorithmperformancedata-structureshash

解决方案


最简单的方法是编写一个函数,该函数接受 aProduct并生成它的唯一字符串表示。确保如果您认为两个相同,则必须取出相同的字符串。(例如对折扣代码进行排序。)

现在您可以将 a ListofProduct对象转换为 a Listof 字符串。您现在可以相当轻松地比较其中两个列表。

如果这些可能很大,一个提示是实际使用描述的 MD5 哈希而不是描述本身。那些会更短,碰撞的几率很低。

如果您想实际识别差异,您应该将表示产品的字符串映射到产品对象。这样,一旦您知道哪些字符串在一个列表中而不在另一个列表中,那么您可以在返回它们之前将字符串转换回对象。


推荐阅读