如何有效比较两个产品列表

问题描述 投票:0回答:1

我正在尝试编写一种方法,该方法可以有效地检查两个产品列表是否相等。

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

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

约束条件

  • 同一产品在列表中可以出现多次。例如(产品A,产品B,产品A,产品C)如果我使用HashSet存储第一个列表的内容,然后解析第二个列表以检查每个产品是否在集合中,则可能会出现问题,因为我可以请将重复项放入HashSet。
  • 如果两个列表包含相同的产品,并且它们出现相同的次数,但是它们的顺序不相关,则认为这两个列表相等。因此,例如,这两个列表(产品A,产品B,产品A,产品C)(产品C,产品A,产品A,产品B)被视为相等。但是这两个(产品A,产品B,产品A,产品C)(产品A,产品B,产品C)被认为是不同的
  • 对象Product的定义如下(请注意,它的代码是自动生成的,所以我不能在其类内编写方法equalshashcode

    class Product {
        private String name;
        private Integer quantity;
        private List<Discount> discountsList;
    
        //some other field not needed for the comparison
    }
    
  • 两个产品具有相同的名称,相同的[[数量和相同的[[discountsList

  • 对于折扣比较列表,元素的顺序也不相关
  • 折扣是这样定义的(同样在这种情况下,该类是自动生成的,我无法编写方法

  • equals和

    hashcode

    )]class Discount { String code; //some other field not needed for the comparison }
  • 两个折扣如果具有相同的代码,则视为相等
  • 需求和偏好

      比较必须高效(我想我必须使用某种哈希)

  • 代码应尽可能简洁(我宁愿避免使用诸如反射之类的东西来解析结构等)

  • [如果可能,我宁愿不使用外部库

  • 我(无效:()方法

    我开始写一个可能的解决方案的草稿,但是我发现了与我的方法不同的阻碍因素,我不知道该以某种方式完善它还是完全重新考虑它。我的想法是在应该执行比较的类中扩展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对象,但由于在Product对象中定义的DiscountList是Discount类型,因此我无法扩展Discount,因此最终我无法使用ComparableDiscount创建。此外,一旦定义了哈希机制,我不知道确切地使用什么最佳方法/数据结构来检查两个列表是否相等您能帮我以最好的方式完成这部分代码吗?
  • java algorithm performance data-structures hash
    1个回答
    0
    投票
    现在您可以将List对象的Product转换为字符串List。现在,您可以轻松比较其中两个列表。

    如果这些建议可能很大,一个技巧是实际使用描述的MD5哈希而不是描述本身。这些将更短,并且发生碰撞的几率在天文数字上很低。

    如果要真正识别差异,则应将代表产品的字符串的映射存储到产品对象。这样,一旦您知道一个列表中有哪些字符串,而不是其他列表中的字符串,则可以在返回它们之前将它们变回对象。

    © www.soinside.com 2019 - 2024. All rights reserved.