美文网首页
Java 两个数组比较内容是否相等

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

作者: 赵哥窟 | 来源:发表于2022-07-07 16:22 被阅读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);
    

    相关文章

      网友评论

          本文标题:Java 两个数组比较内容是否相等

          本文链接:https://www.haomeiwen.com/subject/dsjpbrtx.html