【问题标题】:How to check if number in a list is greater than and in continuation to next number in list如何检查列表中的数字是否大于并延续到列表中的下一个数字
【发布时间】:2021-04-21 11:24:46
【问题描述】:

下面有一个包含 startRange 和 endRange 的对象示例列表。我想检查我的第一个元素 endRange 是否延续到下一个元素中的 startRange 并生成一个输出,如果数字连续,则可以缩短范围。查看示例输出。

  • 示例输入 -

    开始范围:1005000,结束范围:1005799
    开始范围:1005800,结束范围:1005899
    开始范围:1005900,结束范围:1005999
    开始范围:2096000,结束范围:2096999
    开始范围:2097000,结束范围:2097999
    开始范围:2205010,结束范围:2205019

  • 样本输出 -

    startRange : 1005000, endRange : 1005999
    startRange : 2096000, endRange : 2097999
    startRange : 2205010, endRange : 2205019

这是我尝试过的-

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

【问题讨论】:

    标签: java list number-formatting


    【解决方案1】:

    您可以像这样连续成对地迭代它们:

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

    【讨论】:

    • 谢谢@Vala。 D. 您的解决方案工作正常,但它不会将最后一条记录添加到列表中,该列表没有为 lastRange 值增加任何进一步的 startRange 记录。我会尝试修复它并测试它。这比我试图打破循环并添加到列表中要好。例如,使用此输入 - {"rangeStart":"5000","rangeEnd":"5799"}, {"rangeStart":"7000","rangeEnd":"7499"}, {"rangeStart":"7500 ","rangeEnd":"7999"}, {"rangeStart":"9000","rangeEnd":"9600"} 输出即将到来 - {"rangeStart":"5000","rangeEnd":"5799"} { "rangeStart":"7000","rangeEnd":"7999"}
    • 啊,当然。我更新了它以考虑最后一个位置的不相交范围。
    • @Oblivious_S 如果对您有帮助,您可以评价我的回答。
    猜你喜欢
    • 2023-03-07
    • 2017-05-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-12-22
    • 2020-06-28
    相关资源
    最近更新 更多