版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/m0_37625860/article/details/82983055
需求:
工作中遇到了一个常见的一个需求,就是商户平台给商铺添加营业时间。商户多选营业日期,保存后在商户信息出显示周一至周日。
如图:
注:图片来源大众点评。
问题:如何在用户选择后既容易商户后期修改,又易于前端显示。
思考:
1. 商户选择后直接存储周一至周X。
2. 商户选择后存储周一,周二,...周日。
3. 商户选择后存储1,2,..7。
结论:
方案一不便于修改,pass
方案二不便于前端显示,pass
方案三修改方便,但前端显示时需要计算,数据量大时对性能有影响。
解决方案:
选择方案三结合在数据库新建一个字段用于存储计算后的数据(周X至周X)。做到快速查询,易于修改。
算法代码:
package cn.szhtwl.action.modelsupport;
import cn.szhtwl.core.utils.StringUtil;
import java.util.Arrays;
/**
* Created by wh on 2018/9/7.
*/
public class WeekUtil {
//日期字典
private static String[] DATES = {"","周一","周二","周三","周四","周五","周六","周日"};
public static void main(String[] args) {
String s = convertWeek("1,2,4,5,7");
System.out.println(s);
}
/**
* 将数字转换为周数
*
* @author wh
* @date 2018/9/10 15:30
* @param numbers 字符串数字 ["1","2",...]
* @return 字符串 "周一至周二"
*/
public static String convertWeek(String numbers){
String[] data = numbers.split(",");
int[] ints = new int[data.length];
//转换为int
for (int i=0;i<data.length;i++) {
ints[i] = StringUtil.parseInt(data[i]);
}
//1.先正序排序
Arrays.sort(ints);
String s = "";
//存储开始日期
int tempBegin = -1;
//存储结束日期
int tempEnd = -1;
//判断是否连续
for (int i=1;i<=ints.length;i++) {
//判断是否为最后一位
if (i == ints.length) {
//判断是否有连续的
if (-1 != tempBegin && -1 != tempEnd) {
s += DATES[tempBegin]+"至"+DATES[tempEnd]+",";
break;
}
s += DATES[ints[i-1]]+",";
break;
}
// 1+1 = 2 代表连续
if (ints[i] == ints[i-1] + 1) {
if (-1 == tempBegin) {
tempBegin = ints[i-1];
}
tempEnd = ints[i];
} else {
if (-1 != tempBegin && -1!= tempEnd) {
s += DATES[tempBegin]+"至"+DATES[tempEnd]+",";
tempBegin = -1;
tempEnd = -1;
continue;
}
s += DATES[ints[i-1]]+",";
}
}
return s.substring(0,s.length()-1);
}
}