java - 如何有效地比较两个产品列表
问题描述
我正在尝试编写一种方法,以有效的方式检查 2 个产品列表是否相等。
List<Product> firstList = getProductsListFromSomewhere();
List<Product> secondList = getProductsListFromSomewhereElse();
public boolean areListsEqual(List<Product> firstList, List<Product> secondList) {
...
}
约束和条件
- 同一产品可以在列表中出现多次。前任。(产品 A、产品 B、产品 A、产品 C)
如果我使用 HashSet 存储第一个列表的内容然后解析第二个列表以检查每个产品是否在集合中,这可能会出现问题,因为我可以' t 将重复项放入 HashSet。 - 如果这两个列表包含相同的产品并且出现的次数相同但它们的顺序不相关,则它们被认为是相等的。
因此,例如,这两个列表
(产品 A、产品 B、产品 A、产品 C)
(产品 C、产品 A、产品 A、产品 B)
被认为是相等的。
但是这两个
(产品A,产品B,产品A,产品C)
(产品A,产品B,产品C)
被认为是不同的 对象产品定义如下(注意它的代码是自动生成的,所以我不能在它的类中编写方法equals和hashcode )
class Product { private String name; private Integer quantity; private List<Discount> discountsList; //some other field not needed for the comparison }
如果两个产品具有相同的名称、相同的数量和相同的折扣列表,则它们被认为是相等的
同样对于折扣比较列表,元素的顺序不相关
折扣是这样定义的(在这种情况下,类是自动生成的,我不能编写方法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 对象,但我不能扩展 Discount,因为 Product 对象中定义的 discountList 是 Discount 类型,所以我不能使用最终创建的 ComparableDiscount。
此外,一旦定义了散列机制,我不确切知道使用什么是最好的方式/数据结构,以检查两个列表是否相等
你能帮我以最好的方式完成这部分代码吗?
解决方案
最简单的方法是编写一个函数,该函数接受 aProduct
并生成它的唯一字符串表示。确保如果您认为两个相同,则必须取出相同的字符串。(例如对折扣代码进行排序。)
现在您可以将 a List
ofProduct
对象转换为 a List
of 字符串。您现在可以相当轻松地比较其中两个列表。
如果这些可能很大,一个提示是实际使用描述的 MD5 哈希而不是描述本身。那些会更短,碰撞的几率很低。
如果您想实际识别差异,您应该将表示产品的字符串映射到产品对象。这样,一旦您知道哪些字符串在一个列表中而不在另一个列表中,那么您可以在返回它们之前将字符串转换回对象。
推荐阅读
- ios - ReactNative iOS 应用程序仅在指定设备令牌时接收 FCM,但在指定目标时不接收(iOS 应用程序)
- mysql - 在 Mysql 中删除/删除我的数据库时需要帮助
- java - 项目文件中的 Netbeans 搜索从一天到另一天停止工作
- r - 在stackbarplot内缩短小数点
- python - 使用在代码中编写的文件时出现 Blast AttributeError
- web-component - 我如何使用 chai mocha 测试 attributeChangedCallback
- sql - 如何将每行的类别数收集到一行并计算每个类别
- performance - 关于“单个查询的结果集不能超过 20 亿行”的错误
- java - 如何从java中的HashMap中的指定值返回键?
- javascript - URI 正则表达式验证