一个日期时间段有交集求并集的问题
2017-01-08 16:20
281 查看
同学工作中遇到的,问题大概是:输入一系列时间段(开始日期start,结束日期end)返回结果为:时间段若有交集则取其并集,无交集则返回原时间段,如输入:20160101,20160103;20160102,20160105;20160109,20160110;20160110,20160110; 则返回:20160101,20160105;20160109,20160110; 在这里我将输入的格式定为20160101,20160120格式代表开始和结束日期,并将其封装到Single对象中,对single对象初排序sort;然后再取并集,代码如下:
package jsoup; import java.io.BufferedReader; import java.io.IOException; import java.io.InputStreamReader; import java.util.Collections; import java.util.LinkedList; import java.util.List; public class Merge20170108 { public static void main(String[] args) throws IOException{ List<Single> list = new LinkedList<Single>(); BufferedReader br = new BufferedReader(new InputStreamReader(System.in)); String input = br.readLine(); while(input != null && ! input.equals("stop")){ // 若输入stop则停止向list中add操作 list.add(new Single(new String[]{input.substring(0, input.indexOf(",")),input.substring(input.indexOf(",")+1)})); //将输入的20160101,20160104格式的字符串保存在Single對象中 input = br.readLine(); } merge(list); br.close(); } //对已经用开始日期start初排序的list进行交集合并处理 public static void merge(List<Single> list){ Collections.sort(list, new Comparator()); for(int i =0; i<list.size()-1; i++){ Single outer; Single inner; for(int j =i+1; j<list.size(); j++){ outer = list.get(i); inner = list.get(j); String start = outer.start; String end = outer.end; String start2 = inner.start; String end2 = inner.end; if(end.compareTo(start2)>=0 && end.compareTo(end2)<=0){ outer.end = end2; list.set(i, outer); list.remove(j); j--; } else if(end.compareTo(end2)>=0 || start.compareTo(end2)==0){ list.remove(j); j--; } } } for(Single single : list) //輸出操作 System.out.println(single); } } //存放输入的开始日期和结束日期的对象 class Single { String start; String end; public Single(String[] str){ start = str[0]; end = str[1]; } public String toString(){ //重写Single对象的toString方法 return start +"," + end; } } //Single的比较器,比较两个Single对象的开始日期,从而从小到大排序 class Comparator implements java.util.Comparator<Single> { @Override public int compare(Single o1, Single o2) { return o1.start.compareTo(o2.start)>0? 1:-1; } }
相关文章推荐
- 一个日期时间段有交集求并集的问题
- 前台一个日期处理问题
- 一个时间段排斥下的会议安排问题
- 在Oracle的SQL中,如何计算两个日期时间段的交集天数
- Oracle如何获取一个时间段内的所有日期
- 一个 MYSQL 并集 的问题
- 一个Oracle的日期插入问题
- Android实现一个日期处于某个时间段
- 列出一个时间段内的每个日期
- 一个有意思的问题:如何根据一年中的第几周,查询出它周六和周日对应的日期
- 有关日期的一个问题
- 网上流传的一个很牛的日期判断正则表达式的问题,2-29判断问题解决
- J2ME中处理日期相关问题以及收藏一个日期处理类(忽略时间)
- 一个日期转换的问题
- VB6的ActiveX组件中一个诡异的日期格式化显示的问题
- 一个检索最近日期的采购价的问题
- 贪心法解一个数组交集问题
- 解析一个日期段之间的所有月份,年份,日期,周数等问题
- 一个日期的小问题
- 构建一个类,对集合进行运算,包括求集合的交集,并集和差集。