根据元素规则列表筛选元素

漂亮的代码片

代码片.



import java.util.*;
import java.util.stream.Stream;

public class Test04 {
    public static void main(String[] args) {
        //元素规则集合[{max_count:10},{fh_count:2},{x_size:21},{x_count:2}]
        List<Map<String,String>> rules = new ArrayList<>();
        Map<String,String> map1 = new HashMap<>();
        map1.put("max_count","10");
        map1.put("fh_count","2");
        map1.put("x_size","21");
        map1.put("x_count","2");
        rules.add(map1);
        //元素集合
        List<Map<String,String>> elements = new ArrayList<>();
        elements.add(new HashMap<>());//模拟元素集合

        List<Map<String,String>> resultList = new ArrayList<>();//返回的元素结果集
        int tempFhCount = 0;//用来计数的分行元素个数
        int tempZhCount = 0;//用来计数的总行元素个数
        int tempXCount = 0;//用来计数的x_size元素个数

        for (Map<String, String> element : elements) {
            //筛选元素有效期,如果不满足则直接continue;
            //筛选元素生效地区号,如果不满足则直接continue;
            //筛选元素客群,如果不满足则直接continue;

            //程序走到这代表元素有效期、生效地区号、客群筛选均已满足
            if(rules.isEmpty()){
                //如果组件规则列表为空代表不需要别的条件进行筛选了,所以直接将元素添加到返回结果集中
                resultList.add(element);
            }

            //规则非空需要按照规则筛选元素
            if(!rules.isEmpty()){
                Optional<Map<String, String>> maxOptional = rules.stream().filter(x -> StringUtils.isNotBlank(x.get("max_count")) && !"0".equals(x.get("max_count"))).findAny();
                boolean maxFlag = maxOptional.isPresent();//是否有最大个数限制
                int maxCount = maxFlag ? Integer.parseInt(maxOptional.get().get("max_count")) : 0;//最大返回个数

                //有返回个数要求,但返回元素集合已满足个数要求
                if(maxFlag && resultList.size() >= maxCount){
                    continue;
                }

                Optional<Map<String, String>> fhOptional = rules.stream().filter(x -> StringUtils.isNotBlank(x.get("fh_count")) && !"0".equals(x.get("fh_count"))).findAny();
                boolean fhFlag = fhOptional.isPresent();//是否要求返回分行元素
                int fhCount = fhFlag ? Integer.parseInt(fhOptional.get().get("fh_count")) : 0;//分行个数

                String elementAreaCode = element.get("elementAreaCode");//维护机构,8888代表总行

                //分行元素,规则中没有分行个数要求(即不返回分行元素)
                if(!"8888".equals(elementAreaCode) && !fhFlag){
                    continue;
                }

                //分行元素,规则中有分行个数要求,但是返回分行元素已满足个数要求
                if(!"8888".equals(elementAreaCode) && fhFlag && (tempFhCount >= fhCount)){
                    continue;
                }

                //maxCount可能比fhCount大,可能相等,可能maxCount没有值但是fhCount有值,负数代表不限制总行个数,正数代表限制总行个数(0代表不需要返回总行数据)
                int zhCount = (maxCount - fhCount) == 0 ? 0 : (maxCount - fhCount);

                //总行元素,规则中没有总行个数要求(同时维护了fh_count和max_count,max_count减去fh_count等于0代表不需要返回总行元素)
                if("8888".equals(elementAreaCode) && (zhCount == 0)){
                    continue;
                }

                //总行元素,规则中有总行个数要求(同时维护了fh_count和max_count,max_count减去fh_count就是要求返回总行元素的个数),但是返回总行元素已满足个数要求
                if("8888".equals(elementAreaCode) && (zhCount > 0) && (tempZhCount >= zhCount)){
                    continue;
                }

                Optional<Map<String, String>> xSizeOptional = rules.stream().filter(x -> StringUtils.isNotBlank(x.get("x_size"))).findAny();
                boolean xFlag = xSizeOptional.isPresent();//是否有x_size
                String xSize = xFlag ? xSizeOptional.get().get("x_size") : "0";
                Optional<Map<String, String>> nSizeOptional = rules.stream().filter(x -> StringUtils.isNotBlank(x.get("n_size"))).findAny();
                boolean nFlag = nSizeOptional.isPresent();//是否有n_size
                String nSize = nFlag ? nSizeOptional.get().get("n_size") : "0";
                Optional<Map<String, String>> xCountOptional = rules.stream().filter(x -> StringUtils.isNotBlank(x.get("x_count"))).findAny();
                int xCount = xCountOptional.isPresent() ? Integer.parseInt(xSizeOptional.get().get("x_count")) : 0;
                String picSize = element.get("E143");//图片尺寸

                //规则有图片尺寸要求,但是元素没有图片尺寸属性
                if(StringUtils.isBlank(picSize) && (xFlag || nFlag)){
                    continue;
                }

                //规则中有图片尺寸要求,但是元素图片尺寸属性不满足要求
                if(StringUtils.isNotBlank(picSize) && (!picSize.equals(xSize) && !picSize.equals(nSize))){
                    continue;
                }

                //规则中有图片尺寸要求,并且元素图片尺寸满足x_size,但是x_count已满
                if(StringUtils.isNotBlank(picSize) && picSize.equals(xSize) && (tempXCount >= xCount)){
                    continue;
                }

                //程序走到这就说明这个元素满足规则筛选条件了(前面已经将所有不满足的情况都continue了),剩下的就看将该元素算在哪个里面了是fh_count、x_count、还是(max_count减fh_count)里面了
                resultList.add(element);

                //规则中有分行个数限制(需要分行元素),并且有x_size或者n_size(瓷片组件),并且元素图片尺寸与n_size相同,则tempFhCount+1,瓷片组件中n内分行元素个数
                if(fhFlag && (xFlag || nFlag) && picSize.equals(nSize) && !"8888".equals(elementAreaCode)){
                    tempFhCount++;
                    continue;
                }

                //规则中max_count比fh_count大(需要总行元素),并且有x_size或者n_size(瓷片组件),并且元素图片尺寸与n_size相同,则tempZhCount+1,瓷片组件中n内总行元素个数
                if((xFlag || nFlag) && picSize.equals(nSize) && "8888".equals(elementAreaCode)){
                    tempZhCount++;
                    continue;
                }

                //规则中有x_size或者n_size(瓷片组件),并且元素图片尺寸与x_size相同,则tempXCount+1
                if((xFlag || nFlag) && picSize.equals(xSize)){
                    tempXCount++;
                    continue;
                }

                //非瓷片组件,不用判断图片尺寸了,分行元素则tempFhCount++
                if(!"8888".equals(elementAreaCode)){
                    tempFhCount++;
                    continue;
                }

                //非瓷片组件,不用判断图片尺寸了,总行元素则tempZhCount++
                if("8888".equals(elementAreaCode)){
                    tempZhCount++;
                    continue;
                }

            }

        }

    }
}


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值