我有一组日期范围,如果java中有任何日期重叠,我需要得到组合的日期范围
我有一组日期范围,如果Java中有任何日期重叠,我需要获得组合的日期范围 给定三组日期范围,如果任何日期与另一个日期范围重叠,则需要合并 示例:我有一组日期范围,如果java中有任何日期重叠,我需要得到组合的日期范围,java,string,date,intervals,localtime,Java,String,Date,Intervals,Localtime,我有一组日期范围,如果Java中有任何日期重叠,我需要获得组合的日期范围 给定三组日期范围,如果任何日期与另一个日期范围重叠,则需要合并 示例: 20170101-20170331 20170101-20170430 20170430-20170501 20170101-20170430 20170430-20170501 预期结果为: 20170101-20170331 20170101-20170430 20170430-20170501 20170101-20170430 20170
20170101-20170331
20170101-20170430
20170430-20170501
20170101-20170430
20170430-20170501
预期结果为:
20170101-20170331
20170101-20170430
20170430-20170501
20170101-20170430
20170430-20170501
我有字符串变量中的所有日期。请任何人帮我写代码。我已经在我的代码下面粘贴了
我想达到预期的结果。我无法找到需要如何修改此代码。我是初学者,请帮我做那件事。我从StackOverflow获得了这个示例程序
package com.kkkkk.Combine;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Collections;
import java.util.Date;
public class Ideone {
public static void main(String[] args) throws java.lang.Exception {
ArrayList<Interval> x = new ArrayList<>();
x.add(new Interval("20170430", "20170501")); // "20170101", "20170430"
x.add(new Interval("20170101", "20170430"));// 20170101-20170430
x.add(new Interval("20170101", "20170331"));
x = merge(x);
for (Interval i1 : x) {
System.out.println(i1.getStartDate() + " " + i1.getEndDate());
}
}
public static ArrayList<Interval> merge(ArrayList<Interval> intervals) {
if (intervals.size() == 0 || intervals.size() == 1)
return intervals;
ArrayList<Interval> result = new ArrayList<Interval>();
Collections.sort(intervals, new IntervalComparator());
System.out.println("intervals ggggg\n" + intervals + "\n");
Interval first = intervals.get(0);
String start = first.getStartDate();
String end = first.getEndDate();
Date startDateF = null;
Date endDateF = null;
try {
SimpleDateFormat sdf = new SimpleDateFormat("yyyyMMdd");
startDateF = sdf.parse(start);
endDateF = sdf.parse(end);
// ArrayList<Interval> result = new ArrayList<Interval>();
for (int i = 1; i < intervals.size(); i++) {
Interval current = intervals.get(i);
Date currentEndDate = sdf.parse(current.getEndDate());
Date currentStartDate = sdf.parse(current.getStartDate());
// if ((current.getStartDate().after(endDateF)) ||
Date d1 = minDate(endDateF, currentStartDate);
if ((currentStartDate).compareTo(endDateF) <= 0) {
endDateF = maxDate(currentEndDate, endDateF);
} else {
result.add(new Interval(start, (sdf.format(endDateF))));
// start = current.start;
// end = current.end;
start = sdf.format(currentStartDate);
endDateF = (currentEndDate);
enter code here
}
}
result.add(new Interval(start, end));
// result.add(new Interval(start, (sdf.format(endDateF))));
}
catch (ParseException ex) {
ex.printStackTrace();
}
// result.add(new Interval(start, end));
return result;
// return intervals;
}
public static Date minDate(Date date1, Date date2) {
// if date1 before date2 then return date1 else return date2
return date1.before(date2) ? date1 : date2;
}
/**
* find Max Dates
*
* @param date1
* @param date2
* @return
*/
public static Date maxDate(Date date1, Date date2) {
// if date1 after date2 then return date1 else return date2
System.out.println("date max");
return date1.after(date2) ? date1 : date2;
}
}
package com.kkk.Combine;
导入java.text.ParseException;
导入java.text.simpleDataFormat;
导入java.util.ArrayList;
导入java.util.Collections;
导入java.util.Date;
公共类表意词{
公共静态void main(字符串[]args)引发java.lang.Exception{
ArrayList x=新的ArrayList();
x、 添加(新间隔(“20170430”、“20170501”);/“20170101”、“20170430”
x、 添加(新间隔(“20170101”、“20170430”);//20170101-20170430
x、 增加(新区间(“20170101”、“20170331”);
x=合并(x);
对于(间隔i1:x){
System.out.println(i1.getStartDate()+“”+i1.getEndDate());
}
}
公共静态ArrayList合并(ArrayList间隔){
if(interval.size()==0 | | interval.size()==1)
返回间隔;
ArrayList结果=新建ArrayList();
排序(间隔,新IntervalComparator());
System.out.println(“间隔ggggg\n”+间隔+“\n”);
Interval first=Interval.get(0);
字符串start=first.getStartDate();
字符串end=first.getEndDate();
日期startDateF=null;
Date-endDateF=null;
试一试{
SimpleDataFormat sdf=新的SimpleDataFormat(“yyyyMMdd”);
startDateF=sdf.parse(开始);
endDateF=sdf.parse(end);
//ArrayList结果=新建ArrayList();
对于(int i=1;i 如果((currentStartDate).compareTo(endDateF)我假设您的间隔是这样的:
private static class Interval {
private String begin;
private String end;
public Interval(String begin, String end) {
this.begin = begin;
this.end = end;
}
public String getStartDate() {
return begin;
}
public String getEndDate() {
return end;
}
}
您需要做的是合并一个间隔
列表。解决方案是排序
列表,开始日期和结束日期。然后将最早的开始时间和最晚的结束时间存储在光标变量中。例如:
public List<Interval> merge(List<Interval> intervals) {
Collections.sort(intervals, new Comparator<Interval>() {
@Override
public int compare(Interval o1, Interval o2) {
if (o1.getStartDate().equals(o2.getStartDate())) {
return o1.getEndDate().compareTo(o2.getEndDate());
}
return o1.getStartDate().compareTo(o2.getStartDate());
}
});
List<Interval> ret = new ArrayList<>();
String MAX_VAL = "99999999";
String MIN_VAL = "00000000";
String start = MAX_VAL, end = MIN_VAL;
for (Interval interval : intervals) {
if (interval.getStartDate().compareTo(end) > 0) {
if (start.compareTo(MAX_VAL) < 0) {
ret.add(new Interval(start, end));
}
start = interval.getStartDate();
end = interval.getEndDate();
} else {
if (start.compareTo(interval.getStartDate()) < 0) {
start = interval.getStartDate();
}
if (end.compareTo(interval.getEndDate()) > 0) {
end = interval.getEndDate();
}
}
}
if (start.compareTo(MAX_VAL) < 0) {
ret.add(new Interval(start, end));
}
return ret;
}
公共列表合并(列表间隔){
Collections.sort(间隔、新比较器(){
@凌驾
公共整数比较(区间o1、区间o2){
如果(o1.getStartDate()等于(o2.getStartDate()){
返回o1.getEndDate().compareTo(o2.getEndDate());
}
返回o1.getStartDate().compareTo(o2.getStartDate());
}
});
List ret=new ArrayList();
字符串MAX_VAL=“9999999”;
字符串MIN_VAL=“00000000”;
字符串开始=最大值,结束=最小值;
用于(间隔:间隔){
if(interval.getStartDate().compareTo(end)>0){
如果(开始比较到(最大值)<0){
ret.add(新间隔(开始、结束));
}
start=interval.getStartDate();
end=interval.getEndDate();
}否则{
if(start.compareTo(interval.getStartDate())<0){
start=interval.getStartDate();
}
if(end.compareTo(interval.getEndDate())>0){
end=interval.getEndDate();
}
}
}
如果(开始比较到(最大值)<0){
ret.add(新间隔(开始、结束));
}
返回ret;
}
ISO 8601
将日期时间值序列化为文本时,请使用标准ISO 8601格式。您的格式符合标准的“基本”版本,但最好尽可能使用完整格式:
YYYY-MM-DD
对日期范围使用标准格式,使用斜杠字符作为分隔符:
YYYY-MM-DD/YYYY-MM-DD
如果无法更改输入字符串,请拆分连字符上的字符串。将每一部分解析为LocalDate
。使用这些对象实例化LocalDateRange
LocalDate ld = LocalDate.parse( "20170101" , DateTimeFormatter.BASIC_ISO_DATE ) ;
LocalDateRange
使用扩展java.time类功能的项目中的类。在解析和生成文本时使用标准格式
LocalDateRange range = LocalDateRange.parse( "2017-01-01/2017-03-31" ) ;
收集在列表中
要排序,请编写一个调用LocalDateRange::getStart
的比较器
比较另一个范围以查看它们是否重叠。如果重叠,请结合调用union
if ( range.overlaps( otherRange ) ) {
range = range.union( otherRange ) ;
}
如果它们没有重叠,则表示您已完成该轮。请将此结果存储在另一个列表中。
。使用下一个范围开始另一轮
起泡、冲洗、重复。公共静态无效主管道(字符串[]args){
public static void main(String[] args) {
// TODO Auto-generated method stub
ArrayList<MainLab.Interval> list = new ArrayList<MainLab.Interval>();
list.add(new MainLab.Interval("20170430", "20170501"));
list.add(new MainLab.Interval("20170101", "20170430"));
list.add(new MainLab.Interval("20170101", "20170331"));
for (Iterator iterator = mergeInterval(list).iterator(); iterator.hasNext();) {
Interval interval = (Interval) iterator.next();
System.out.println(interval.getStart()+ "==="+interval.getEnd());
}
}
public static List<Interval> mergeInterval(ArrayList<MainLab.Interval> list){
/*
* Sort the list , Interval class have implemented Comparable Interface.
* So we will get sorted intervals. Intervals sorted based on start of interval
*/
Collections.sort(list);
Set<MainLab.Interval> resultlist = new TreeSet<MainLab.Interval>();
List<MainLab.Interval> mergedIntervals = new ArrayList<MainLab.Interval>();
//declare date formate to parse and format date from string to and from
SimpleDateFormat sdf = new SimpleDateFormat("yyyyMMdd");
if(list.size() == 1){
//resultlist = list
return list;
}
if(list.size() > 1){
// get first interval Object. conside it as first interval
Interval mergeInterval = list.get(0);
// loop other intervals from second in the list
for(int i=1; i< list.size() ; i++){
Interval interval2 = list.get(i);
try{
Date startDate1 = sdf.parse(mergeInterval.getStart());
Date endDate1 = sdf.parse(mergeInterval.getEnd());
Date startDate2 = sdf.parse(interval2.getStart());
Date endDate2 = sdf.parse(interval2.getEnd());
// compare if current interval's start date is before merging interval's end date
// then the two intervals are overlaping
if(startDate2.compareTo(endDate1) < 0 ){
// check whether end date of current loop interval is after the merging interval.
// then we need to update the end date of merging interval with looping interval's end date
if(endDate2.compareTo(endDate1) > 0 ){
mergeInterval.setEnd(interval2.getEnd());
}
}else{
// compare if current interval's start date is after merging interval's end date
// then it must be a new interval start so swap mergInterval variable with current looping interval
mergeInterval = interval2;
}
//add merge interval to set.
resultlist.add(mergeInterval);
}catch(Exception ex){
ex.printStackTrace();
}
}
}
mergedIntervals.addAll(resultlist);
return mergedIntervals;
}
public static class Interval implements Comparable<Interval>{
private String start;
private String end;
public String getStart() {
return start;
}
public void setStart(String start) {
this.start = start;
}
public String getEnd() {
return end;
}
public void setEnd(String end) {
this.end = end;
}
public Interval(){
}
public Interval(String start,String end){
this.start = start;
this.end = end;
}
@Override
public boolean equals(Object obj) {
// TODO Auto-generated method stub
Interval inteval = (Interval)obj;
return this.getStart().equals(inteval.getStart()) && this.getEnd().equals(inteval.getEnd()) ;
}
@Override
public int compareTo(Interval o) {
// TODO Auto-generated method stub
SimpleDateFormat sdf = new SimpleDateFormat("yyyyMMdd");
try{
Date startDate = sdf.parse(start);
Date endDate = sdf.parse(end);
Date pstartDate = sdf.parse(o.start);
Date pendDate = sdf.parse(o.end);
return startDate.compareTo(pstartDate);
}catch(Exception ex){
ex.printStackTrace();
}
return 0;
}
}
//TODO自动生成的方法存根
ArrayList=新建ArrayList();
添加列表(新的主实验室间隔(“20170430”、“20170501”);
添加列表(新的主实验室间隔(“20170101”、“20170430”);
添加列表(新的主实验室间隔(“20170101”、“20170331”);
for(Iterator Iterator=mergeInterval(list).Iterator();Iterator.hasNext();){
Interval=(Interval)迭代器.next();
System.out.println(interval.getStart()+“=”+interval.getEnd());
}
}
公共静态列表合并间隔(ArrayList列表){
/*
*排序列表、区间类都实现了可比接口。
*所以我们将得到排序的间隔。间隔根据间隔的开始排序