我正在尝试根据输入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]
答案 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 ]
查看文档:
答案 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;
}
}