I have below a sample list of objects containing startRange and endRange as longs. I want to check if my first element endRange is in continuation to startRange in the next element and generate an output where the range can be shortened if numbers are in continuation. See sample output.
Sample Input -
startRange : 1005000, endRange : 1005799
startRange : 1005800, endRange : 1005899
startRange : 1005900, endRange : 1005999
startRange : 2096000, endRange : 2096999
startRange : 2097000, endRange : 2097999
startRange : 2205010, endRange : 2205019
Sample Output -
startRange : 1005000, endRange : 1005999
startRange : 2096000, endRange : 2097999
startRange : 2205010, endRange : 2205019
This is what I have tried -
List<BinRange> finalRange = new ArrayList<>();
for (BinRange bin : list.getBinRanges()) {
rangeStart = bin.getRangeStart();
rangeEnd = bin.getRangeEnd();
System.out.println("startRange : " + rangeStart + ", endRange : " + rangeEnd);
long diff = Math.abs(rangeEnd - rangeStart);
if (diff == 1) {
continue;
} else {
rangeEnd = bin.getRangeEnd();
BinRange binRange = new BinRange(rangeStart, rangeEnd);
finalRange.add(binRange);
break;
}
}
You could iterate them in consecutive pairs as such:
static List<BinRange> check(final List<BinRange> ranges)
{
// trivial
if (ranges.size() < 2)
{
return ranges;
}
var resultRanges = new ArrayList<BinRange>();
Long prevStart = null;
for (int i = 1, rangesSize = ranges.size(); i < rangesSize; i++)
{
final BinRange prevRange = ranges.get(i - 1);
final BinRange currRange = ranges.get(i);
if (prevStart == null)
{
prevStart = prevRange.getRangeStart();
}
if (prevRange.getRangeEnd() != currRange.getRangeStart() - 1)
{
resultRanges.add(prevStart == prevRange.getRangeStart()
? prevRange // recycle instance
: new BinRange(prevStart, prevRange.getRangeEnd()));
prevStart = null;
}
if (i == rangesSize - 1)
{
resultRanges.add(prevStart == null
? currRange // recycle instance
: new BinRange(prevStart, currRange.getRangeEnd()));
}
}
return resultRanges;
}