有时候,我们需要将大的集合按指定的数量分割成若干个小集合。(比如:集合作为SQL中IN的参数,而SQL又有长度限制,所以需要分批分几次进行查询)
虽然此需求感觉不常见,但偶也写过几次类似的方法,故记录之。
更新于2017年:其实Guava库有个已有的方法实现此需求:Lists.partition(List<T> list, int size)
v2,更新于2016-01-20
v1的代码使用后发现有问题,如果对分组后的一子集作删除操作,其他子集用迭代器遍历时会出现ConcurrentModificationException。
修改后的代码如下:
以简单的方式重现ConcurrentModificationException异常:
v1,更新于2016-01-18
工具类
测试类
import java.util.ArrayList; import java.util.List; import org.junit.Test; public class CollectionGroupUtilTest { /** * 大于分组数量的情况 */ @Test public void test() { List<String> allList = new ArrayList<String>(); for (int i = 1; i <= 504; i++) { allList.add(i + ""); } List<List<String>> groupList = CollectionGroupUtil.groupListByQuantity(allList, 50); int i = 0; List<String> list = null; for (int c = 0; c < groupList.size(); c++) { list = groupList.get(c); System.out.println("第" + (c + 1) + "组: "); for (String temp : list) { System.out.print(temp + ", "); } System.out.println(); } } /** * 小于分组数量的情况 */ @Test public void test2() { List<String> allList = new ArrayList<String>(); for (int i = 1; i <= 45; i++) { allList.add(i + ""); } List<List<String>> groupList = CollectionGroupUtil.groupListByQuantity(allList, 50); int i = 0; List<String> list = null; for (int c = 0; c < groupList.size(); c++) { list = groupList.get(c); System.out.println("第" + (c + 1) + "组: "); for (String temp : list) { System.out.print(temp + ", "); } System.out.println(); } } /** * 集合只有一个记录的情况 */ @Test public void test3() { List<String> allList = new ArrayList<String>(); for (int i = 1; i <= 1; i++) { allList.add(i + ""); } List<List<String>> groupList = CollectionGroupUtil.groupListByQuantity(allList, 50); int i = 0; List<String> list = null; for (int c = 0; c < groupList.size(); c++) { list = groupList.get(c); System.out.println("第" + (c + 1) + "组: "); for (String temp : list) { System.out.print(temp + ", "); } System.out.println(); } } /** * 空集合的情况 */ @Test public void test4() { List<List<String>> groupList = CollectionGroupUtil.groupListByQuantity(null, 50); System.out.println(groupList); groupList = CollectionGroupUtil.groupListByQuantity(new ArrayList(), 50); System.out.println(groupList); } /** * 集合刚满一个分组的情况 */ @Test public void test5() { List<String> allList = new ArrayList<String>(); for (int i = 1; i <= 50; i++) { allList.add(i + ""); } List<List<String>> groupList = CollectionGroupUtil.groupListByQuantity(allList, 50); int i = 0; List<String> list = null; for (int c = 0; c < groupList.size(); c++) { list = groupList.get(c); System.out.println("第" + (c + 1) + "组: "); for (String temp : list) { System.out.print(temp + ", "); } System.out.println(); } } }