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);
}