Java 两个数组比较内容是否相等

2022-07-07  本文已影响0人  赵哥窟
需求

有两个数组,前提是数组对象是一样的。需要比较这两个数组中对象的值是否一致?需要考虑对象的顺序。如果对象里面在嵌套一个数组怎么处理。

实现

重写对象equals()和hashcode()方法

1.为什么要重写equals()方法?
因为object中的equals()方法比较的是对象的引用地址是否相等,当需要判断对象里的内容是否相等,则需要重写equals()方法。

2.重写equals()方法为什么要同时重写hashcode()方法?
重写equals()方法同时重写hashcode()方法,就是为了保证当两个对象通过equals()方法比较相等时,他们的hashCode值也一定要保证相等。

新增两个对象

@Data
@Slf4j
public class ProductBillingConfigCompare {

    /**
     * 费用类型
     */
    private String costType;

    /**
     * 结算周期
     */
    private String settlementInterval;

    /**
     * 计算方式
     */
    private String calculateWay;

    /**
     * 费用比例
     */
    private BigDecimal costValue;

    /**
     * 服务费列表
     */
    private List<ProductBillingConfigExt> billingConfigExtList;

    @Override
    public boolean equals(Object obj) {
        if(this == obj){
            return true;//地址相等
        }
        if(obj == null){
            return false;//非空性:对于任意非空引用x,x.equals(null)应该返回false。
        }

        if(obj instanceof ProductBillingConfigCompare){
            ProductBillingConfigCompare configCompare = (ProductBillingConfigCompare) obj;
            //比较两个对象嵌套数组的对象值,不考虑排序问题
            boolean listCompare = false;
            List<ProductBillingConfigExt> compareList = new ArrayList<>();
            //如果两个对象的数组都不为空
            if(!CollectionUtils.isEmpty(this.billingConfigExtList) && !CollectionUtils.isEmpty(configCompare.billingConfigExtList)){
                //当两个数组Size一样才比较对象的值是否相等,如果Size不一样直接false
                if(this.billingConfigExtList.size() == configCompare.getBillingConfigExtList().size()){
                    for (int i = 0; i < this.billingConfigExtList.size(); i++) {
                        ProductBillingConfigExt configExt1 =  this.billingConfigExtList.get(i);
                        for (int j = 0; j < configCompare.billingConfigExtList.size() ; j++) {
                            ProductBillingConfigExt configExt2 =  this.billingConfigExtList.get(j);
                            if(configExt1.equals(configExt2)){
                                compareList.add(configExt1);
                                break;
                            }
                        }
                    }
                }
                //如果比较结果数组和当前对象的数组Size一样则两个数组值一直
                if(this.billingConfigExtList.size() == compareList.size()){
                    listCompare = true;
                }
            }else if(CollectionUtils.isEmpty(this.billingConfigExtList) && CollectionUtils.isEmpty(configCompare.billingConfigExtList)){
                //两个对象数组都为空则对象嵌套的数组相同
                listCompare = true;
            }

            //需要比较的字段相等,则这两个对象相等
            if(this.costType.equals(configCompare.getCostType())
                    && this.settlementInterval.equals(configCompare.getSettlementInterval())
                    && this.calculateWay.equals(configCompare.getCalculateWay())
                    && this.costValue.equals(configCompare.getCostValue())
                    && listCompare){
                return true;
            }

        }

        return false;
    }

    @Override
    public int hashCode() {
        int result = 17;
        result = 31 * result + (costType == null ? 0 : costType.hashCode());
        result = 31 * result + (settlementInterval == null ? 0 : settlementInterval.hashCode());
        result = 31 * result + (calculateWay == null ? 0 : calculateWay.hashCode());
        result = 31 * result + (costValue == null ? 0 : costValue.hashCode());
        result = 31 * result + (billingConfigExtList == null ? 0 : billingConfigExtList.hashCode());
        return result;
    }

}
@Data
public class ProductBillingConfigExt {

    /**
     * 服务费范围开始
     */
    private BigDecimal serviceFeeStart;

    /**
     * 服务费范围结束
     */
    private BigDecimal serviceFeeEnd;

    /**
     * 比例/固定值
     */
    private BigDecimal serviceFee;

    @Override
    public boolean equals(Object obj) {
        if(this == obj){
            return true;//地址相等
        }
        if(obj == null){
            return false;//非空性:对于任意非空引用x,x.equals(null)应该返回false。
        }

        if(obj instanceof ProductBillingConfigCompare){
            ProductBillingConfigExt configExt = (ProductBillingConfigExt) obj;
            //需要比较的字段相等,则这两个对象相等
            if(this.serviceFeeStart.equals(configExt.getServiceFeeStart())
                    && this.serviceFeeEnd.equals(configExt.getServiceFeeEnd())
                    && this.serviceFee.equals(configExt.getServiceFee())){
                return true;
            }
        }

        return false;
    }

    @Override
    public int hashCode() {
        int result = 17;
        result = 31 * result + (serviceFeeStart == null ? 0 : serviceFeeStart.hashCode());
        result = 31 * result + (serviceFeeEnd == null ? 0 : serviceFeeEnd.hashCode());
        result = 31 * result + (serviceFee == null ? 0 : serviceFee.hashCode());
        return result;
    }
}

在写一个比较方法

public static boolean isListEqual(List<ProductBillingConfigCompare> list1, List<ProductBillingConfigCompare> list2) {
        // 两个list引用相同(包括两者都为空指针的情况)
        if (list1 == list2) {
            return true;
        }
        // 两个list都为空(包括空指针、元素个数为0)
        if ((list1 == null && list2 != null && list2.size() == 0)
                || (list2 == null && list1 != null && list1.size() == 0)) {
            return true;
        }
        // 两个list元素个数不相同
        if (list1.size() != list2.size()) {
            return false;
        }
        // 两个list元素个数已经相同,再比较两者内容
        // 采用这种可以忽略list中的元素的顺序
        // 涉及到对象的比较是否相同时,确保实现了equals()方法
        if (!list1.containsAll(list2)) {
            return false;
        }
        return true;
    }

调用

  boolean result = isListEqual(list1,list2);
上一篇下一篇

猜你喜欢

热点阅读