要求
对一个数组,按指写个数n,划为一组。
比如有一个数组,包含1200000
的数据,要求每1000
为一组。放到一个新的Array里要怎么处理呢。
方法肯定有很多,可以一一来验证。
取模
可能是最简单的方式:取模。可以用少最数据验证一下。 思路很简单:
- 对 step 取模,每到1000就打印一下,这一步也机以创建新的数组都可以的
- else就是普通的处理
public class Test {
public static void main(String[] args) {
int total = 120;
int step = 10;
int[] array = new int[total];
for (int i = 0; i < total; i ) {
if (i % step == 0) {
// 在这里相当于可以做一些特殊的开头处理,比如创建一个新的容器之类,这里我就直接用来打印
array[i] = i;
System.out.println(Arrays.toString(array));
} else {
array[i] = i;
}
}
System.out.println(Arrays.toString(array));
}
}
结果:
代码语言:javascript复制0
10
20
30
40
50
60
70
80
90
100
110
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, 96, 97, 98, 99, 100, 101, 102, 103, 104, 105, 106, 107, 108, 109, 110, 111, 112, 113, 114, 115, 116, 117, 118, 119]
分段
这个思路是:把每一段的start
和end
直接算出来。
这样有一个好处,就是可以提前知道每一段的位置,这样可以提前做一些处理。比如,在并发场景下,可以把每一段的start
和end
直接拿到,提交给不是的线程去处理。
实现
代码语言:javascript复制public class ListTest {
public static void test1() {
int data = 1200000;
int batch = 5;
int segment = data / batch;
for (int i = 0; i < batch; i ) {
int start = i * segment;
int end = start segment - 1;
System.out.println("start: " start);
System.out.println("end: " end);
}
}
}
可以看一下结果,下面这样就很棒棒了:
代码语言:javascript复制start: 0
end: 239999
start: 240000
end: 479999
start: 480000
end: 719999
start: 720000
end: 959999
start: 960000
end: 1199999
假设现在有一个线程池,就可以直接用上,比如在定时任务计算一天的订单或者其它批量任务,就可以这样分。
双层for
虽然是双层for,但是很多刚开始学算法的人,未必能想到这种方式。 这种方式的关键点在于,i 的每一段都是 j 的起点,这种方式最大的好处是,煅练算法的小技巧,让自己多了解一种技巧。 结果是一样的,可以自行验证。
代码语言:javascript复制public class StepTest {
public static void main(String[] args) {
int[] arr = new int[100000];
int step = 100;
int count = 0;
for (int i = 0; i < arr.length ; i = i step) {
System.out.println("current count: " count );
for (int j = i; j < i step && j < arr.length ; j ) {
arr[j] = j;
System.out.println(arr[j]);
}
}
}
}
总结
分组算法,还有很多种,这里只是抛砖引玉,最主要还是熟练这种用法,当做一个基础的练习。