Range consolidation: Difference between revisions

(Kotlin implementation)
Line 440:
| | | | 3 10| |
+-------+-------+---+-----+-----+</lang>
 
=={{header|Java}}==
<lang java>
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collections;
import java.util.Comparator;
import java.util.List;
 
public class RangeConsolidation {
 
public static void main(String[] args) {
displayRanges( Arrays.asList(new Range(1.1, 2.2)));
displayRanges( Arrays.asList(new Range(6.1, 7.2), new Range(7.2, 8.3)));
displayRanges( Arrays.asList(new Range(4, 3), new Range(2, 1)));
displayRanges( Arrays.asList(new Range(4, 3), new Range(2, 1), new Range(-1, -2), new Range(3.9, 10)));
displayRanges( Arrays.asList(new Range(1, 3), new Range(-6, -1), new Range(-4, -5), new Range(8, 2), new Range(-6, -6)));
displayRanges( Arrays.asList(new Range(1, 1), new Range(1, 1)));
displayRanges( Arrays.asList(new Range(1, 1), new Range(1, 2)));
displayRanges( Arrays.asList(new Range(1, 2), new Range(3, 4), new Range(1.5, 3.5), new Range(1.2, 2.5)));
}
private static final void displayRanges(List<Range> ranges) {
System.out.printf("ranges = %-70s, colsolidated = %s%n", ranges, Range.consolidate(ranges));
}
private static final class RangeSorter implements Comparator<Range> {
@Override
public int compare(Range o1, Range o2) {
return (int) (o1.left - o2.left);
}
}
 
private static class Range {
double left;
double right;
public Range(double left, double right) {
if ( left <= right ) {
this.left = left;
this.right = right;
}
else {
this.left = right;
this.right = left;
}
}
public Range consolidate(Range range) {
// no overlap
if ( this.right < range.left ) {
return null;
}
// no overlap
if ( range.right < this.left ) {
return null;
}
// contained
if ( this.left <= range.left && this.right >= range.right ) {
return this;
}
// contained
if ( range.left <= this.left && range.right >= this.right ) {
return range;
}
// overlap
if ( this.left <= range.left && this.right <= range.right ) {
return new Range(this.left, range.right);
}
// overlap
if ( this.left >= range.left && this.right >= range.right ) {
return new Range(range.left, this.right);
}
throw new RuntimeException("ERROR: Logic invalid.");
}
@Override
public String toString() {
return "[" + left + ", " + right + "]";
}
private static List<Range> consolidate(List<Range> ranges) {
List<Range> consolidated = new ArrayList<>();
Collections.sort(ranges, new RangeSorter());
for ( Range inRange : ranges ) {
Range r = null;
Range conRange = null;
for ( Range conRangeLoop : consolidated ) {
r = inRange.consolidate(conRangeLoop);
if (r != null ) {
conRange = conRangeLoop;
break;
}
}
if ( r == null ) {
consolidated.add(inRange);
}
else {
consolidated.remove(conRange);
consolidated.add(r);
}
}
Collections.sort(consolidated, new RangeSorter());
return consolidated;
}
}
 
}
</lang>
 
{{out}}
Required and other examples.
<pre>
ranges = [[1.1, 2.2]] , consolidated = [[1.1, 2.2]]
ranges = [[6.1, 7.2], [7.2, 8.3]] , consolidated = [[6.1, 8.3]]
ranges = [[1.0, 2.0], [3.0, 4.0]] , consolidated = [[1.0, 2.0], [3.0, 4.0]]
ranges = [[-2.0, -1.0], [1.0, 2.0], [3.0, 4.0], [3.9, 10.0]] , consolidated = [[-2.0, -1.0], [1.0, 2.0], [3.0, 10.0]]
ranges = [[-6.0, -1.0], [-6.0, -6.0], [-5.0, -4.0], [1.0, 3.0], [2.0, 8.0]] , consolidated = [[-6.0, -1.0], [1.0, 8.0]]
ranges = [[1.0, 1.0], [1.0, 1.0]] , consolidated = [[1.0, 1.0]]
ranges = [[1.0, 1.0], [1.0, 2.0]] , consolidated = [[1.0, 2.0]]
ranges = [[1.0, 2.0], [1.5, 3.5], [1.2, 2.5], [3.0, 4.0]] , consolidated = [[1.0, 4.0]]
</pre>
 
=={{header|JavaScript}}==