工作中遇到需求: 取查询时段内记录,由于涉及到无效数据时段,且无效时段会有交集,将交集部分合并,不交集部分则不作处理, 故记录如下:
public static List<String[]> getNoRepeatStopTime(List<String[]>listIn){
//先根据开始时间排序
Collections.sort(listIn, new Comparator<String[]>() {
@Override
public int compare(String[] o1, String[] o2) {
return o1[0].compareTo(o2[0]);
}
});
//定义输出变量
List<String[]> listOut = new ArrayList<String[]>();
//中间变量,用于比对的开始时间和结束时间
String begin = "";
String end = "";
for (int i = 0,size = listIn.size();i < size;i++){
//循环取出开始时间结束时间
String[] tmp = listIn.get(i);
//第一次循环先把中间变量赋值
if(i==0){
begin = tmp[0];
end = tmp[1];
}else{
//本次循环的开始时间小于等于上次结束时间
if(tmp[0].compareTo(end) <=0 ){
//本次循环的结束时间大于上次结束时间
if(tmp[1].compareTo(end) >0){
//将本次循环的结束时间赋值给中间变量
end = tmp[1];
}
}else{
//本次循环的开始时间大于上次结束时间,直接添加到结果,且重新给中间变量赋值
String[] str = {begin,end};
listOut.add(str);
begin = tmp[0];
end = tmp[1];
}
}
//最后一次循环将结果添加
if(i==(size-1)){
String[] str = {begin,end};
listOut.add(str);
}
}
return listOut;
}
示例:
public static void main(String[] args) throws Exception {
List<String[]> listIn = new ArrayList<>();
String[] a = {"2021-08-01 00:00:00", "2021-08-09 10:00:00"};
String[] b = {"2021-08-07 00:00:00", "2021-08-13 10:00:00"};
String[] c = {"2021-08-13 11:00:00", "2021-08-15 10:00:00"};
listIn.add(a);
listIn.add(b);
listIn.add(c);
for (String[] s : fib(listIn)) {
System.out.println(Arrays.toString(s));
}
}
结果:
[2021-08-01 00:00:00, 2021-08-13 10:00:00]
[2021-08-13 11:00:00, 2021-08-15 10:00:00]