java:list大量数据,每隔n个数据就拆分成一个小list
public static void main(String[] args) {
List ipsList = new ArrayList();
// 小于一个拆分量
// for (int i = 0; i < 6; i++) {
// 拆分两个整数倍
// for (int i = 0; i < 26; i++) {
// 带余数的拆分量
for (int i = 0; i < 104; i++) {
ipsList.add(i);
}
int batchSize = 9;
// 每9个数据拆分一个list,计算有几个list
int tradeIpSize = ipsList.size() / batchSize;
int leaf = ipsList.size() % batchSize;
// 如果余数大于0, 一个list
if ( leaf > 0 ) {
tradeIpSize += 1;
}
System.out.println(ipsList);
for (int i = 0; i < tradeIpSize; i++) {
List list = Collections.emptyList();
// 判断是否是最后一个list
if ( (batchSize + i*batchSize) > ipsList.size()){
// 如果是最后一个list,结束就是list长度
list = ipsList.subList(i*batchSize, ipsList.size());
}else{
// 如果不是最后一个list,就正常输出
list = ipsList.subList(i*batchSize, batchSize + i*batchSize);
}
System.out.println(list);
}
}
场景:sql中in的条件个数切分
解决方案1:使用java 的集合实现
通过这种方式整理思路。
public void cutCondition(List<Object> dataList) {
if (dataList != null || dataList.size() > 0) {
// in条件的容量设置
int conditionCapacity = 999;
// 每999个条件截取一个in的值, 得出有多少个999行数据
int conditionCapacitySize = dataList.size() / conditionCapacity;
int leaf = dataList.size() % conditionCapacity;
if ( leaf > 0 ) {
conditionCapacitySize += 1;
}
// 上面的conditionCapacitySize方便理解,这替换成下面的。
// int conditionCapacitySize = dataList.size() % conditionCapacity > 0 ? dataList.size() / conditionCapacity + 1 : dataList.size() / conditionCapacity;
for (int i = 0; i < conditionCapacitySize; i++) {
List<Object> conditionsList = Collections.emptyList();
// 判断是否是最后一个list
if ( (conditionCapacity + i*conditionCapacity) > dataList.size()){
// 如果是最后一个list,结束就是list长度
conditionsList = dataList.subList(i*conditionCapacity, dataList.size());
}else{
// 如果不是最后一个list,就正常输出
conditionsList = dataList.subList(i*conditionCapacity, conditionCapacity + i*conditionCapacity);
}
// sql拼接,java8可以使用StringJoiner,十分的nice;
StringBuffer conditions = new StringBuffer();
for (int j = 0; j < conditionsList.size(); j++) {
String condition = conditionsList.get(j);
conditions.append("'").append(condition).append("',");
}
System.out.println("第" + i + "组条件是:");
}
}
}
解决方案2:使用guava的集合实现
guava是谷歌开发工具包。这种方式实现就简便很多了。
public void cutCondition(List<String> dataList) {
if (dataList != null || dataList.size() > 0) {
// in条件的容量设置
int conditionCapacity = 999;
// 每999个条件截取一个in的值, 得出有多少个999行数据
int conditionCapacitySize = dataList.size() % conditionCapacity > 0 ? dataList.size() / conditionCapacity + 1 : dataList.size() / conditionCapacity;
// 根据子任务的容量,将其拆分成n个集合。 Lists是guava工具包,十分的方便。
List<List<String>> partions = Lists.partition(dataList,conditionCapacitySize);
for (int i = 0; i < partions; i++) {
List<String> sonList = partions.get(i);
// sql拼接,java8可以使用StringJoiner,十分的nice
// 三个参数分别为分隔符,前缀,后缀。
StringBuffer conditions = new StringBuffer();
StringJoiner conditions2 = new StringJoiner("','", "'", "'");
for (int j = 0; j < sonList.size(); j++) {
String condition = sonList.get(j);
conditions.append("','").append(condition);
if(j == sonList.size() - 1) {
conditions.append("'");
}else{
conditions.append("',");
}
conditions2.add(condition);
}
}
}
}
版权声明:本文为qq_35802544原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。