Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/342.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/wcf/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 拆分重叠并添加缺少的间隔_Java_Intervals - Fatal编程技术网

Java 拆分重叠并添加缺少的间隔

Java 拆分重叠并添加缺少的间隔,java,intervals,Java,Intervals,我有一组[startdate,enddate]间隔,可以重叠并包含间隙。 我的目标是有一个连续的新间隔列表,没有间隔,没有任何重叠的日期 范围示例: [-----------------------------------A-----------------------] [-B] [-C] [D] [-----E-----] [-----F----]

我有一组[startdate,enddate]间隔,可以重叠并包含间隙。 我的目标是有一个连续的新间隔列表,没有间隔,没有任何重叠的日期

范围示例:

[-----------------------------------A-----------------------]
[-B]
   [-C]
      [D]
                  [-----E-----]
                              [-----F----]
                                                                    [-----G-----]                

A [2009-01-01 - 2014-01-01]     ~5 years
B [2009-01-01 - 2009-01-02]     2 days
C [2009-01-02 - 2009-01-03]     2 days
D [2009-01-04 - 2009-01-04]     1 day
E [2010-01-01 - 2011-01-01]     ~1 year
F [2011-01-01 - 2012-01-01]     ~1 year, a gap after this interval
G [2015-01-01 - 2016-01-01]     ~1 year
我期望的是新的间隔列表:

[2009-01-01 - 2009-01-01]
[2009-01-02 - 2009-01-02]
[2009-01-03 - 2009-01-03]
[2009-01-04 - 2009-01-04]
[2009-01-05 - 2009-12-31]
[2010-01-01 - 2010-12-31]
[2011-01-01 - 2012-01-01]
[2012-01-02 - 2014-01-01]
[2014-01-02 - 2014-12-31]
[2015-01-01 - 2016-01-01]
因此,对于间隙,添加了新的间隔。起始日期和结束日期相同的时间间隔是完全有效的,应按此处理

即使在以一种有效的方式实现这一目标之前,我仍然坚持认为这两种方法都是最好的:(


有没有关于如何在Java中执行此操作的想法?

首先,按开始日期对它们进行排序

然后对它们进行迭代,并进行以下所有操作,以将每一项与下一项进行比较:

  • 如果
    curr.end>=next.start
    curr.end=next.start-1

  • 如果
    curr.end
    则将其删除

  • 如果
    curr.end
    ,则添加新的:

    new.start=curr.end+1
    new.end=next.start-1
    
还要跟踪最长结束日期(更新前),如果
max(end)>last.end
,则添加新的:

new.start=last.end+1
new.end=最大值(end)
您可以尝试my library的,并使用以下代码:

DateInterval a = DateInterval.between(PlainDate.of(2009, 1, 1), PlainDate.of(2014, 1, 1));
DateInterval b = DateInterval.between(PlainDate.of(2009, 1, 1), PlainDate.of(2009, 1, 2));
DateInterval c = DateInterval.between(PlainDate.of(2009, 1, 2), PlainDate.of(2009, 1, 3));
DateInterval d = DateInterval.between(PlainDate.of(2009, 1, 4), PlainDate.of(2009, 1, 4));
DateInterval e = DateInterval.between(PlainDate.of(2010, 1, 1), PlainDate.of(2011, 1, 1));
DateInterval f = DateInterval.between(PlainDate.of(2011, 1, 1), PlainDate.of(2012, 1, 1));
DateInterval g = DateInterval.between(PlainDate.of(2015, 1, 1), PlainDate.of(2016, 1, 1));

List<DateInterval> intervals = Arrays.asList(a, b, c, d, e, f, g);

IntervalCollection<PlainDate> icoll = IntervalCollection.onDateAxis().plus(intervals);

for (ChronoInterval<PlainDate> gap : icoll.withGaps().getIntervals()) {
    icoll = icoll.plus(gap);
}

System.out.println(icoll.withSplits());

[2009-01-01/2009-01-01],
[2009-01-02/2009-01-02],
[2009-01-03/2009-01-03],
[2009-01-04/2009-01-04],
[2009-01-05/2009-12-31],
[2010-01-01/2010-12-31],
[2011-01-01/2011-01-01],
[2011-01-02/2012-01-01],
[2012-01-02/2014-01-01],
[2014-01-02/2014-12-31],
[2015-01-01/2016-01-01]
DateInterval a=DateInterval.between(自2009年1月1日起生效),自2014年1月1日起生效);
DateInterval b=介于(2009,1,1)的纯日期和(2009,1,2)的纯日期之间的日期间隔;
DateInterval c=介于(2009年的(1,2)的(1,2)的(2009年的)的(1,3)的(2)之间的日期间隔;
DateInterval d=介于(2009年第1,4页的明文日期)和(2009年第1,4页的明文日期)之间的日期间隔;
DateInterval e=介于(2010年1月1日)和(2011年1月1日)之间的日期间隔;
DateInterval f=介于(2011年1月1日)和(2012年1月1日)之间的日期间隔;
DateInterval g=日期间隔(2015年第1期第1天),2016年第1期第1天第1天);
列表间隔=数组.asList(a,b,c,d,e,f,g);
IntervalCollection icoll=IntervalCollection.onDateAxis().plus(间隔);
对于(计时间隔:icoll.withGaps().GetInterval()){
icoll=icoll.plus(间隙);
}
System.out.println(icoll.withSplits());
[2009-01-01/2009-01-01],
[2009-01-02/2009-01-02],
[2009-01-03/2009-01-03],
[2009-01-04/2009-01-04],
[2009-01-05/2009-12-31],
[2010-01-01/2010-12-31],
[2011-01-01/2011-01-01],
[2011-01-02/2012-01-01],
[2012-01-02/2014-01-01],
[2014-01-02/2014-12-31],
[2015-01-01/2016-01-01]
评论您的预期结果:

你的陈述

我的目标是有一个连续的新间隔列表,没有间隔 没有任何重叠的日期

使用上面的代码实现。在拆分之前,间隔作为正常间隔添加到整个间隔集合中。默认情况下,Time4J中的所有日期间隔都作为闭合间隔处理(可配置)。这意味着,例如“[2009-01-01/2009-01-01]”这样的间隔只包含一天(正如您在预期间隔列表的第一个条目中所示)

然而,您似乎并不期望间隔“[2011-01-01/2011-01-01]”,但仅此日期(仅由一天组成的间隔)是间隔E+F之间的重叠区域,也应出现在您的预期间隔列表中

关于与Java-8的互操作性:


您还可以在类型
net.time4j.PlainDate
java.time.LocalDate

之间应用直接转换方法,如果您使用java8,您可以使用java.time.Period。然后对所有时段进行排序,并比较两个连续时段的开始/结束。@Heri否,一个
时段既没有开始也没有结束(不固定在日期行上)。OP需要一个间隔解决方案。Period提供了许多可以用来解决问题的操作:between()通过两个LocalDate构造它。使用addTo()和subtractFrom()可以进行计算是的,这正是我的意思。是的,关于缺少的间隔,你是对的。:)上面显示的
toString()
生成的方括号表示闭合的间隔边界(日期间隔的标准)。无论如何,您也可以选择自己的自定义间隔格式,请参阅API方法,如。