/* package whatever; // don't place package name! */
import java.util.*;
import java.lang.*;
import java.io.*;
import java.time.*;
import java.time.temporal.*;
import java.time.format.*;
/* Name of the class has to be "Main" only if the class is public. */
class Ideone
{
{
List<DateRange> ranges = new ArrayList<> ( 3 );
ranges.add ( new DateRange ( LocalDate.of ( 2017 , Month.JANUARY , 17 ) , LocalDate.of ( 2017 , Month.MARCH , 7 ) ) );
ranges.add ( new DateRange ( LocalDate.of ( 2017 , Month.FEBRUARY , 12 ) , LocalDate.of ( 2017 , Month.FEBRUARY , 16 ) ) );
ranges.add ( new DateRange ( LocalDate.of ( 2017 , Month.FEBRUARY , 14 ) , LocalDate.of ( 2017 , Month.MARCH , 25 ) ) );
System.
out.
println ( "ranges: " + ranges
);
// Intersect and combine to create a sequence of new DateRange objects.
// Collect each start & stop as individual `LocalDate` objects.
List<LocalDate> dates = new ArrayList<> ( ranges.size () * 2 );
for ( DateRange range : ranges ) {
dates.add ( range.start );
dates.add ( range.stop );
}
// Sort the collection of dates.
// Loop the sorted dates, creating DateRange objects as we go.
List<DateRange> rangesOutput = new ArrayList<> ( dates.size () ); // Not an exact initial capacity but good enough.
for ( int i = 1 ; i < dates.size () ; i ++ ) {
LocalDate start = dates.get ( i - 1 ); // Subtract one for silly index counting.
LocalDate stop = dates.get ( i + 1 - 1 ); // Subtract one for silly index counting. Or use ( i ) instead.
if ( ! start.equals ( stop ) ) { // If not equal, proceed. (If equal, ignore and move on to next loop.)
DateRange range = new DateRange ( start , stop );
rangesOutput.add ( range );
}
}
System.
out.
println ( "rangesOutput: " + rangesOutput
);
}
}
class DateRange {
public LocalDate start, stop;
public DateRange ( LocalDate start , LocalDate stop ) {
if ( stop.isBefore ( start ) ) {
}
this.start = start;
this.stop = stop;
}
@Override
return "DateRange{ " + "start=" + start + ", stop=" + stop + " }";
}
}
LyogcGFja2FnZSB3aGF0ZXZlcjsgLy8gZG9uJ3QgcGxhY2UgcGFja2FnZSBuYW1lISAqLwoKaW1wb3J0IGphdmEudXRpbC4qOwppbXBvcnQgamF2YS5sYW5nLio7CmltcG9ydCBqYXZhLmlvLio7CgppbXBvcnQgamF2YS50aW1lLio7CmltcG9ydCBqYXZhLnRpbWUudGVtcG9yYWwuKjsKaW1wb3J0IGphdmEudGltZS5mb3JtYXQuKjsKCi8qIE5hbWUgb2YgdGhlIGNsYXNzIGhhcyB0byBiZSAiTWFpbiIgb25seSBpZiB0aGUgY2xhc3MgaXMgcHVibGljLiAqLwpjbGFzcyBJZGVvbmUKewoJcHVibGljIHN0YXRpYyB2b2lkIG1haW4gKFN0cmluZ1tdIGFyZ3MpIHRocm93cyBqYXZhLmxhbmcuRXhjZXB0aW9uCgl7CgogICAgICAgIExpc3Q8RGF0ZVJhbmdlPiByYW5nZXMgPSBuZXcgQXJyYXlMaXN0PD4gKCAzICk7CiAgICAgICAgcmFuZ2VzLmFkZCAoIG5ldyBEYXRlUmFuZ2UgKCBMb2NhbERhdGUub2YgKCAyMDE3ICwgTW9udGguSkFOVUFSWSAsIDE3ICkgLCBMb2NhbERhdGUub2YgKCAyMDE3ICwgTW9udGguTUFSQ0ggLCA3ICkgKSApOwogICAgICAgIHJhbmdlcy5hZGQgKCBuZXcgRGF0ZVJhbmdlICggTG9jYWxEYXRlLm9mICggMjAxNyAsIE1vbnRoLkZFQlJVQVJZICwgMTIgKSAsIExvY2FsRGF0ZS5vZiAoIDIwMTcgLCBNb250aC5GRUJSVUFSWSAsIDE2ICkgKSApOwogICAgICAgIHJhbmdlcy5hZGQgKCBuZXcgRGF0ZVJhbmdlICggTG9jYWxEYXRlLm9mICggMjAxNyAsIE1vbnRoLkZFQlJVQVJZICwgMTQgKSAsIExvY2FsRGF0ZS5vZiAoIDIwMTcgLCBNb250aC5NQVJDSCAsIDI1ICkgKSApOwoKICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4gKCAicmFuZ2VzOiAiICsgcmFuZ2VzICk7CgogICAgICAgIC8vIEludGVyc2VjdCBhbmQgY29tYmluZSB0byBjcmVhdGUgYSBzZXF1ZW5jZSBvZiBuZXcgRGF0ZVJhbmdlIG9iamVjdHMuCiAgICAgICAgLy8gQ29sbGVjdCBlYWNoIHN0YXJ0ICYgc3RvcCBhcyBpbmRpdmlkdWFsIGBMb2NhbERhdGVgIG9iamVjdHMuCiAgICAgICAgTGlzdDxMb2NhbERhdGU+IGRhdGVzID0gbmV3IEFycmF5TGlzdDw+ICggcmFuZ2VzLnNpemUgKCkgKiAyICk7CiAgICAgICAgZm9yICggRGF0ZVJhbmdlIHJhbmdlIDogcmFuZ2VzICkgewogICAgICAgICAgICBkYXRlcy5hZGQgKCByYW5nZS5zdGFydCApOwogICAgICAgICAgICBkYXRlcy5hZGQgKCByYW5nZS5zdG9wICk7CiAgICAgICAgfQoKICAgICAgICAvLyBTb3J0IHRoZSBjb2xsZWN0aW9uIG9mIGRhdGVzLgogICAgICAgIENvbGxlY3Rpb25zLnNvcnQgKCBkYXRlcyApOwoKICAgICAgICAvLyBMb29wIHRoZSBzb3J0ZWQgZGF0ZXMsIGNyZWF0aW5nIERhdGVSYW5nZSBvYmplY3RzIGFzIHdlIGdvLgogICAgICAgIExpc3Q8RGF0ZVJhbmdlPiByYW5nZXNPdXRwdXQgPSBuZXcgQXJyYXlMaXN0PD4gKCBkYXRlcy5zaXplICgpICk7IC8vIE5vdCBhbiBleGFjdCBpbml0aWFsIGNhcGFjaXR5IGJ1dCBnb29kIGVub3VnaC4KICAgICAgICBmb3IgKCBpbnQgaSA9IDEgOyBpIDwgZGF0ZXMuc2l6ZSAoKSA7IGkgKysgKSB7CiAgICAgICAgICAgIExvY2FsRGF0ZSBzdGFydCA9IGRhdGVzLmdldCAoIGkgLSAxICk7IC8vIFN1YnRyYWN0IG9uZSBmb3Igc2lsbHkgaW5kZXggY291bnRpbmcuCiAgICAgICAgICAgIExvY2FsRGF0ZSBzdG9wID0gZGF0ZXMuZ2V0ICggaSArIDEgLSAxICk7IC8vIFN1YnRyYWN0IG9uZSBmb3Igc2lsbHkgaW5kZXggY291bnRpbmcuIE9yIHVzZSAoIGkgKSBpbnN0ZWFkLgogICAgICAgICAgICBpZiAoICAhIHN0YXJ0LmVxdWFscyAoIHN0b3AgKSApIHsgIC8vIElmIG5vdCBlcXVhbCwgcHJvY2VlZC4gKElmIGVxdWFsLCBpZ25vcmUgYW5kIG1vdmUgb24gdG8gbmV4dCBsb29wLikKICAgICAgICAgICAgICAgIERhdGVSYW5nZSByYW5nZSA9IG5ldyBEYXRlUmFuZ2UgKCBzdGFydCAsIHN0b3AgKTsKICAgICAgICAgICAgICAgIHJhbmdlc091dHB1dC5hZGQgKCByYW5nZSApOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbiAoICJyYW5nZXNPdXRwdXQ6ICIgKyByYW5nZXNPdXRwdXQgKTsKCgl9Cn0KCmNsYXNzIERhdGVSYW5nZSB7CgogICAgcHVibGljIExvY2FsRGF0ZSBzdGFydCwgc3RvcDsKCiAgICBwdWJsaWMgRGF0ZVJhbmdlICggTG9jYWxEYXRlIHN0YXJ0ICwgTG9jYWxEYXRlIHN0b3AgKSB7CiAgICAgICAgaWYgKCBzdG9wLmlzQmVmb3JlICggc3RhcnQgKSApIHsKICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiAoICJUaGUgc3RvcCBkYXRlIGlzIGJlZm9yZSB0aGUgc3RhcnQgZGF0ZS4iICk7CiAgICAgICAgfQogICAgICAgIHRoaXMuc3RhcnQgPSBzdGFydDsKICAgICAgICB0aGlzLnN0b3AgPSBzdG9wOwogICAgfQoKICAgIEBPdmVycmlkZQogICAgcHVibGljIFN0cmluZyB0b1N0cmluZyAoKSB7CiAgICAgICAgcmV0dXJuICJEYXRlUmFuZ2V7ICIgKyAic3RhcnQ9IiArIHN0YXJ0ICsgIiwgc3RvcD0iICsgc3RvcCArICIgfSI7CiAgICB9Cgp9Cg==
ranges: [DateRange{ start=2017-01-17, stop=2017-03-07 }, DateRange{ start=2017-02-12, stop=2017-02-16 }, DateRange{ start=2017-02-14, stop=2017-03-25 }]
rangesOutput: [DateRange{ start=2017-01-17, stop=2017-02-12 }, DateRange{ start=2017-02-12, stop=2017-02-14 }, DateRange{ start=2017-02-14, stop=2017-02-16 }, DateRange{ start=2017-02-16, stop=2017-03-07 }, DateRange{ start=2017-03-07, stop=2017-03-25 }]