在Java中生成范围

时间:2018-11-14 14:02:48

标签: java

我正在尝试根据输入batchSize和batchInterval生成范围。但是,由于逻辑问题,我缺少了一些批次。

我正在从SQL DB获取一批记录。由于数据传输的巨大延迟,下游服务出现了问题。因此,我想批量查询数据。

select * from table WHERE RN > ? AND RN <= ?

两个问号在范围的上下限

public class Ranges {

    public static void main(String[] args) {
        int batchTotal= 605;
        int batchInterval = 100;

        System.out.println(generateBatches(batchTotal, batchInterval).toString());

        batchTotal = 605;
        batchInterval = 5;

        System.out.println(generateBatches(batchTotal, batchInterval).toString());
    }

    public static Set<String> generateBatches(int batchTotal, int batchInterval) {
        int rangeLower = 0;
        int rangeUpper = 0;
        Set<String> ranges = new TreeSet<String>();
        int numberOfIterableBatches = 0;
        if (batchTotal < batchInterval) {
            ranges.add(rangeLower + " - " + batchInterval);
        } else {
            numberOfIterableBatches = (int) java.lang.Math.ceil(batchTotal / batchInterval);
            System.out.println(numberOfIterableBatches);
            for (int i = 0; i <= numberOfIterableBatches; i++) {
                if (i == 0) {
                    rangeLower = 0;
                    rangeUpper = i + 1;
                } else {
                    rangeLower = i - 1;
                    rangeUpper = i;
                }
                ranges.add(rangeLower + " - " + rangeUpper);
            }
        }

        return ranges;
    }

}

当我使用List<String>时,我得到了重复的副本。因此,我正在使用Set<String>。这是示例输出

6
[0 - 1, 0 - 1, 1 - 2, 2 - 3, 3 - 4, 4 - 5, 5 - 6]
121
[0 - 1, 0 - 1, 1 - 2, 2 - 3, 3 - 4, 4 - 5, 5 - 6, 6 - 7, 7 - 8, 8 - 9, 9 - 10, 10 - 11, 11 - 12, 12 - 13, 13 - 14, 14 - 15, 15 - 16, 16 - 17, 17 - 18, 18 - 19, 19 - 20, 20 - 21, 21 - 22, 22 - 23, 23 - 24, 24 - 25, 25 - 26, 26 - 27, 27 - 28, 28 - 29, 29 - 30, 30 - 31, 31 - 32, 32 - 33, 33 - 34, 34 - 35, 35 - 36, 36 - 37, 37 - 38, 38 - 39, 39 - 40, 40 - 41, 41 - 42, 42 - 43, 43 - 44, 44 - 45, 45 - 46, 46 - 47, 47 - 48, 48 - 49, 49 - 50, 50 - 51, 51 - 52, 52 - 53, 53 - 54, 54 - 55, 55 - 56, 56 - 57, 57 - 58, 58 - 59, 59 - 60, 60 - 61, 61 - 62, 62 - 63, 63 - 64, 64 - 65, 65 - 66, 66 - 67, 67 - 68, 68 - 69, 69 - 70, 70 - 71, 71 - 72, 72 - 73, 73 - 74, 74 - 75, 75 - 76, 76 - 77, 77 - 78, 78 - 79, 79 - 80, 80 - 81, 81 - 82, 82 - 83, 83 - 84, 84 - 85, 85 - 86, 86 - 87, 87 - 88, 88 - 89, 89 - 90, 90 - 91, 91 - 92, 92 - 93, 93 - 94, 94 - 95, 95 - 96, 96 - 97, 97 - 98, 98 - 99, 99 - 100, 100 - 101, 101 - 102, 102 - 103, 103 - 104, 104 - 105, 105 - 106, 106 - 107, 107 - 108, 108 - 109, 109 - 110, 110 - 111, 111 - 112, 112 - 113, 113 - 114, 114 - 115, 115 - 116, 116 - 117, 117 - 118, 118 - 119, 119 - 120, 120 - 121]

2 个答案:

答案 0 :(得分:0)

看看番石榴库中的Iterables

public static <T> Iterable<List<T>> partition(Iterable<T> iterable, int size)

您可以这样使用它:

int outerLowerBound = 0;    
int outerUpperBound = 605;
int numberOfParts = 5;

List<Integer> collect = IntStream.range(outerLowerBound, outerUpperBound)
                        .boxed().collect(Collectors.toList());
Iterable<List<Integer>> partitions = Iterables.partition(collect, numberOfParts);

在分区列表中是您的时间间隔。然后对于每个间隔;第一项是下限,最后一项是上限。

for (List<Integer> partition : partitions) {
    System.out.println("[ " + Iterables.getFirst(partition, 0) + ", " + Iterables.getLast(partition) + " ]");
}

输出:

[ 1, 5 ]
[ 6, 10 ]
[ 11, 15 ]
[ 16, 20 ]
[ 21, 25 ]
[ 26, 30 ]
[ 31, 35 ]
...
[ 581, 585 ]
[ 586, 590 ]
[ 591, 595 ]
[ 596, 600 ]
[ 601, 604 ]

查看文档:

https://google.github.io/guava/releases/21.0/api/docs/com/google/common/collect/Iterables.html#partition-java.lang.Iterable-int-

答案 1 :(得分:0)

代码不必要地复杂,或者我误解了这个问题:)

public class Ranges {

    public static void main(String[] args) {
        int batchTotal = 605;
        int batchInterval = 100;

        System.out.println(generateBatches(batchTotal, batchInterval).toString());

        batchTotal = 605;
        batchInterval = 5;

        System.out.println(generateBatches(batchTotal, batchInterval).toString());
    }

    public static List<String> generateBatches(int batchTotal, int batchInterval) {
        List<String> ranges = new ArrayList<String>();
        int n = batchTotal;
        int rangeStart = 0;
        while (n > 0) {
            ranges.add(rangeStart + "-" + ((rangeStart + batchInterval) > batchTotal ? batchTotal : rangeStart + batchInterval));
            rangeStart += batchInterval;
            n -= batchInterval;
        }
        return ranges;
    }

}