Search code examples
javalistnumber-formatting

How to check if number in a list is greater than and in continuation to next number in list


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;
    }
}

Solution

  • 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;
    }