Java - 将 List 等分(最后一部分处理多余部分)
背景
今天由于要使用多线程,所以事先需要确定启动线程个数。于是需要先将集合进行分配,确定线程的个数。
解决方案
首先是实现
public static <T> List<List<T>> splitList(List<T> list, int blockSize) { List<List<T>> lists = new ArrayList<List<T>>(); if(blockSize == 1){ lists.add(list); return lists; } if (list != null && blockSize > 0) { int listSize = list.size(); if(listSize<=blockSize){ lists.add(list); return lists; } int batchSize = listSize / blockSize; int remain = listSize % blockSize; for (int i = 0; i < batchSize; i++) { int fromIndex = i * blockSize; int toIndex = fromIndex + blockSize; System.out.println("fromIndex=" + fromIndex + ", toIndex=" + toIndex); lists.add(list.subList(fromIndex, toIndex)); } if(remain>0){ System.out.println("fromIndex=" + (listSize-remain) + ", toIndex=" + (listSize)); lists.add(list.subList(listSize-remain, listSize)); } } return lists; }
其次是调用
List<List<String>> sublists = splitbList(transNoList, nCount/ThreadCount);
我们可以看到,返回的结构List<List<T>>的每一个元素都是一个list对象,即每一个分配好的小集合 :)