目录
1. 概述
我们编程中经常遇到将数组分成n份的需求,比如:将任务平均分配,一批货物入到x个容量为n的仓库
2.将数组n个一份分组
/**
* 等分数组
*
* @param source 来源
* @param size 每份的数量
* @param <T> 类型
* @return 等分后的结果
*/
public static <T> List<List<T>> divide(List<T> source, int size) {
if (size <= 0) {
throw new IllegalArgumentException("每份的数量必须大于0");
}
if (source == null || source.size() <= 0) {
return null;
}
List<List<T>> result = new ArrayList<>();
int cursor = 0;
int total = source.size();
while (cursor < total) {
int index = Math.min(cursor + size, total);
List<T> item = source.subList(cursor, index);
result.add(item);
cursor = index;
}
return result;
}
3.将数组分成n份(严格来说不是等分)
/**
* 等分数组
*
* @param source 来源
* @param size 切分份数
* @param <T> 类型
* @return 等分后的结果
*/
public static <T> List<List<T>> divide1(List<T> source, int size) {
if (source == null || source.size() <= 0) {
return null;
}
if (size <= 0 && size > source.size()) {
throw new IllegalArgumentException("等分份数必须大于0,小于数据的数量");
}
//初始化容器
List<List<T>> result = new ArrayList<>();
for (int i = 0; i < size; i++) {
List<T> r = new ArrayList<>();
result.add(r);
}
int cursor = 0;
int total = source.size();
while (cursor < total) {
int index = Math.min(cursor + size, total);
List<T> item = source.subList(cursor, index);
int itemSize = item.size();
for (int i = 0; i < result.size(); i++) {
if (itemSize >= i + 1) {
List<T> r = result.get(i);
r.add(item.get(i));
}
}
cursor = index;
}
return result;
}
4.小结
上面提到的“任务平均分配”就可以用到3里的方法;货物入仓可以用到2里的方法。