要求

对一个数组,按指写个数n,划为一组。
比如有一个数组,包含1200000 的数据,要求每1000为一组。放到一个新的Array里要怎么处理呢。
方法肯定有很多,可以一一来验证。

取模

可能是最简单的方式:取模。可以用少最数据验证一下。
思路很简单:

  1. 对 step 取模,每到1000就打印一下,这一步也机以创建新的数组都可以的
  2. else就是普通的处理
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
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));
}
}

结果:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
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]

分段

这个思路是:把每一段的startend直接算出来。
这样有一个好处,就是可以提前知道每一段的位置,这样可以提前做一些处理。比如,在并发场景下,可以把每一段的startend直接拿到,提交给不是的线程去处理。

实现

1
2
3
4
5
6
7
8
9
10
11
12
13
14
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);
}
}
}

可以看一下结果,下面这样就很棒棒了:

1
2
3
4
5
6
7
8
9
10
start: 0
end: 239999
start: 240000
end: 479999
start: 480000
end: 719999
start: 720000
end: 959999
start: 960000
end: 1199999

假设现在有一个线程池,就可以直接用上,比如在定时任务计算一天的订单或者其它批量任务,就可以这样分。

双层for

虽然是双层for,但是很多刚开始学算法的人,未必能想到这种方式。
这种方式的关键点在于,i 的每一段都是 j 的起点,这种方式最大的好处是,煅练算法的小技巧,让自己多了解一种技巧。
结果是一样的,可以自行验证。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
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]);
}
}
}
}

总结

分组算法,还有很多种,这里只是抛砖引玉,最主要还是熟练这种用法,当做一个基础的练习。