年龄标签合并的问题

1.运用场景

1.1  运营在后台给资源打年龄标签,如:0-0.5岁,0.5-1岁,1-2岁,2-3岁,3-6岁,6岁+。当该资源显示在前端的时候就会把这些标签全部展示出来,给用户看到时候就会显得非常的臃肿。

2.问题分析

2.1 其实上面这些标签的年龄跨度是连起来的,展示给前端的时候应该合并。如:0-0.5岁,0.5-1岁,1-2岁,2-3岁应该合并成0-3岁。1-2岁,2-3岁,2-6岁,6岁+,应该合并成1岁+。0-0.5岁,0.5-1岁,1-2岁的标签的话需要合并成:0-2岁。

好了现在的需求明确了就是要写代码来合并了。

3.解决方案

 /**
     * 标签转换
     *
     * @return
     * @Author: Tian Luhua
     */
    public static List<String> listLabelVo2ListLabel(List<LabelVo> labelVos) {
        if (labelVos == null)
            return null;
        List<String> labels = labelVos.stream().map(LabelVo::getName).filter(item -> !matchPublishLevelLabel(item)).collect(Collectors.toList());

        //1.将年龄标签和非年龄标签分组
        Map<Boolean, List<String>> groupLabels = labels.stream().collect(Collectors.groupingBy(Vo2ApiVoUtil::matchAgeLabel, Collectors.toList()));
        List<String> otherLabels = groupLabels.get(false);
        List<String> ageLabels = groupLabels.get(true);
        //2.判断是否存在年龄标签
        if (ageLabels != null && ageLabels.size() > 0) {
            List<String> mageAfterLabels = magerAgeLabels(ageLabels);
            if (otherLabels != null) {
                //3.把合并后的年龄标签和其他的标签再次合并返回前端
                otherLabels.addAll(mageAfterLabels);
                return otherLabels;
            } else {
                //4.如果没有其他的标签就直接返回年龄标签
                return mageAfterLabels;
            }
        } else {
            return labels;
        }
    }


    /**
     * 合并年龄标签
     *
     * @return
     * @Author: Tian Luhua
     */
    private static List<String> magerAgeLabels(List<String> ageLabels) {
        //0  年龄标签只有一个的话就直接返回,多个的话就走合并逻辑
        if (ageLabels.size() > 1) {
            //1.年龄标签多个
            String firstAgeLabel = ageLabels.get(0);
            String lastAgeLabel = ageLabels.get(ageLabels.size() - 1);
            StringBuilder afterAgeLabel = new StringBuilder();
            if (isAgePlusLabel(lastAgeLabel)) {
                //1.2 年龄标签>=2,并且有带+号格式的年龄标签
                String f = firstAgeLabel.split("-")[0];
                afterAgeLabel.append(f).append("岁+");
            } else {
                //1.1 年龄标签>=2,没有有带+号格式的年龄标签
                String f = firstAgeLabel.split("-")[0];
                String l = lastAgeLabel.split("-")[1];
                afterAgeLabel.append(f).append("-").append(l);
            }
            ageLabels.clear();
            ageLabels.add(afterAgeLabel.toString());
        }
        return ageLabels;
    }

    /**
     * 判断是否是年龄标签
     *
     * @param ageLabel
     * @return
     * @Author: Tian Luhua
     */
    private static boolean matchAgeLabel(String ageLabel) {
        String pattern1 = "[0-9][.][0-9][-][0-9][.][0-9][岁]";
        String pattern2 = "[0-9][-][0-9][.][0-9][岁]";
        String pattern3 = "[0-9][.][0-9][-][0-9][岁]";
        String pattern4 = "[0-9][-][0-9][岁]";
        boolean isMatch1 = Pattern.matches(pattern1, ageLabel);
        boolean isMatch2 = Pattern.matches(pattern2, ageLabel);
        boolean isMatch3 = Pattern.matches(pattern3, ageLabel);
        boolean isMatch4 = Pattern.matches(pattern4, ageLabel);
        if (isMatch1 || isMatch2 || isMatch3 || isMatch4 || isAgePlusLabel(ageLabel)) {
            return true;
        } else {
            return false;
        }
    }

    /**
     * 检查带+号格式的年龄标签
     *
     * @param ageLabel
     * @return
     * @Author: Tian Luhua
     */
    private static boolean isAgePlusLabel(String ageLabel) {
        String agePlus1 = "[0-9][岁][+]";
        String agePlus2 = "[0-9][.][0-9][岁][+]";
        return Pattern.matches(agePlus1, ageLabel) || Pattern.matches(agePlus2, ageLabel);
    }

 

 

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值