有需求如下:
选中连续时间,显示时做合并所选内容。如:
选中:周一、周二、周三、周四、周五
显示:周一至周五
选中:周一、周二、周三、周五、周六
显示:周一至周三,周五至周六
以此类推
代码如下:
public static String getNewOpenDay(String openDay) {
// 排序规则
Map<String, Integer> map = new HashMap<>();
map.put("周一", 1);
map.put("周二", 2);
map.put("周三", 3);
map.put("周四", 4);
map.put("周五", 5);
map.put("周六", 6);
map.put("周日", 7);
String[] days = openDay.split("、");
StringBuilder sb = new StringBuilder();
// 是否连续
int continuous = 0;
// 是否开始节点 如 周一至周五 中的 周一 || 周一, 周三至周六 中的 周三 和 周一
boolean first = true;
// 定义新数组,重新排序,可按自己的规则进行排序
String[] attr = new String[7];
for (int i = 0; i < days.length; i++) {
attr[map.get(days[i]) - 1] = days[i];
}
// 遍历新数组拼接字符串
for (int i = 0; i < attr.length; i++) {
// 当前字符串不为空
if (StringUtils.isNotBlank(attr[i])) {
// 判断是否是开始节点
if (first) {
sb.append(attr[i]);
// 赋值后不是开始节点
first = false;
// 连续值加1
continuous++;
} else {
// 有连续值表示不是开始,有可能连续值是1
if (continuous > 0) {
continuous++;
}
// 如果是最后一个时间,直接拼接,无需处理
if (attr.length-1 == i) {
sb.append("至").append(attr[i]);
}
}
} else {
// 判断当前字符串是否已拼接过,若没拼接过,无需处理
if (StringUtils.isNotBlank(sb.toString())) {
// 判断是否是开始节点,若是开始节点也无需处理
if (!first) {
// 判断是否是连续值,若是连续值,且大于1,则取前一位数值
if (continuous > 1) {
sb.append("至").append(attr[i-1]);
}
// 若不是最后一个时间,以逗号分割,重置开始节点值,连续值
if (attr.length-1 != i) {
sb.append(",");
first = true;
continuous = 0;
}
}
}
}
}
if (sb.toString().endsWith(",")) {
return sb.substring(0, sb.toString().length()-1);
} else {
return sb.toString();
}
}
public static void main(String[] args) {
String a = "周六、周日、周四";
System.out.println(getNewOpenDay(a));
String b = "周一、周二、周三、周四、周五";
System.out.println(getNewOpenDay(b));
String c = "周一";
System.out.println(getNewOpenDay(c));
String d = "周一、周二、周四、周五、周六";
System.out.println(getNewOpenDay(d));
String e = "周一、周二、周四、周五、周日";
System.out.println(getNewOpenDay(e));
String f = "周日、周一、周二";
System.out.println(getNewOpenDay(f));
String g = "周日、周五、周一、周三";
System.out.println(getNewOpenDay(g));
}
输出结果:
周四,周六至周日
周一至周五
周一
周一至周二,周四至周六
周一至周二,周四至周五,周日
周一至周二,周日
周一,周三,周五,周日