java: list大量数据,每隔n个数据就拆分成一个小list

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);
				}
			}
		}
	}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值