`
bianrongxin
  • 浏览: 102049 次
  • 性别: Icon_minigender_1
社区版块
存档分类
最新评论

Java 将List按照指定大小分段

阅读更多

    有的时候,如果我们需要将现有的List按照指定的大小(size)分成段到新的newList中,newList中的每个元素都是一个原有的List,原有的List中包含size个元素,见如下代码:

 

 

 

public class ListUtils {

    
    
    /**
     * 分割List
     * @author bianrx
     * @date 2012.1.13
     * @param list 待分割的list
     * @param pageSize 每段list的大小
     * @return List<<List<T>> 
     */
     public static <T> List<List<T>> splitList(List<T> list, int pageSize) {
       
        int listSize = list.size();                                                           //list的大小
        int page = (listSize + (pageSize-1))/ pageSize;                      //页数
       
        List<List<T>> listArray = new ArrayList<List<T>>();              //创建list数组 ,用来保存分割后的list
        for(int i=0;i<page;i++) {                                                         //按照数组大小遍历
            List<T> subList = new ArrayList<T>();                               //数组每一位放入一个分割后的list
            for(int j=0;j<listSize;j++) {                                                 //遍历待分割的list
                int pageIndex = ( (j + 1) + (pageSize-1) ) / pageSize;   //当前记录的页码(第几页)
                if(pageIndex == (i + 1)) {                                               //当前记录的页码等于要放入的页码时
                    subList.add(list.get(j));                                               //放入list中的元素到分割后的list(subList)
                }
               
                if( (j + 1) == ((j + 1) * pageSize) ) {                               //当放满一页时退出当前循环
                    break;
                }
            }
            listArray.add(subList);                                                         //将分割后的list放入对应的数组的位中
        }
        return listArray;
    }
   
    public static void main(String[] s) {
       
        List<String> strlist = new ArrayList<String>();
        for(int i=0;i<120;i++) {
            strlist.add("aa" + (i+1));
        }
        List<List<String>> list = split2List(strlist, 17);
       
        int index = 1;
        for(List<String> strlist2: list) {
            System.out.println(index++);
            System.out.println("----------------------------------");
            for(String str: strlist2) {
                System.out.print(str + "\t");
            }
            System.out.println("END");
            System.out.println();
        }
    }
   
   
}

 

以下是最新实现方式,效率有很大提升,已经测试通过,欢迎拍砖。

public static <T> List<List<T>> splitList(List<T> list, int pageSize) {

List<List<T>> listArray = new ArrayList<List<T>>();

List<T> subList = null; 

for (int i = 0; i < list.size(); i++) {

if (i % pageSize == 0) {//每次到达页大小的边界就重新申请一个subList

subList = new ArrayList<T>();

listArray.add(subList);

}

subList.add(list.get(i));

}

return listArray;

}

分享到:
评论
10 楼 cmonbb 2019-04-15  
public List<List<T>> splitList(List<T> list) {
        int pageSize = 200;
        int pageTotal = (list.size() + pageSize - 1) / pageSize;
        List<List<T>> listArray = new ArrayList<>();
        for (int pageIndex = 0; pageIndex < pageTotal; pageIndex++) {
            if (pageIndex + 1 < pageTotal) {
                listArray.add(list.subList(pageIndex * pageSize, pageIndex * pageSize + pageSize));
            } else {
                listArray.add(list.subList(pageIndex * pageSize, list.size()));
            }
        }
        return listArray;
    }
9 楼 bianrongxin 2017-03-23  

以下是最新的实现方式,效率有很大提升,已经测试通过,欢迎拍砖。


public static <T> List<List<T>> splitList(List<T> list, int pageSize) {
List<List<T>> listArray = new ArrayList<List<T>>();
List<T> subList = null;
for (int i = 0; i < list.size(); i++) {
if (i % pageSize == 0) {//每次到达页大小的边界就重新申请一个subList
subList = new ArrayList<T>();
listArray.add(subList);
}
subList.add(list.get(i));
}
return listArray;
}
8 楼 wwvv 2015-09-16  
不错,这是另外一种思路的实现方法
public static <T> List<List<T>> splitList(List<T> list, int pageSize) {
        List<List<T>> listArray = new ArrayList<List<T>>();
       
        ArrayList<T> al = new ArrayList<T>();
        for(T x : list){
            al.add(x);
            if (pageSize == al.size()){
                listArray.add(al);
                al = new ArrayList<T>();
            }
        }
       
        if (0 != al.size())
            listArray.add(al);
       
        return listArray;
    }
7 楼 wangkai0681080 2014-10-14  
flyu109 说的对,那个地方错了
6 楼 wangkai0681080 2014-10-13  
前辈牛!借用前辈的代码了
5 楼 zqb666kkk 2014-09-22  
没发现有错误啊?
flyu109 写道
if( (j + 1) == ((j + 1) * pageSize) ) {                               //当放满一页时退出当前循环
                    break;
                }  有错误
应该改成

if( (j + 1) == ((i + 1) * pageSize) ) {                               //当放满一页时退出当前循环
                    break;
                }

4 楼 flyu109 2014-06-26  
if( (j + 1) == ((j + 1) * pageSize) ) {                               //当放满一页时退出当前循环
                    break;
                }  有错误
应该改成

if( (j + 1) == ((i + 1) * pageSize) ) {                               //当放满一页时退出当前循环
                    break;
                }
3 楼 shangql 2014-06-24  
前辈,晚生膜拜
2 楼 xisuchi 2013-04-01  
挺好用的 
1 楼 zyhui98 2013-02-26  

不错啊,挺好用的。

相关推荐

Global site tag (gtag.js) - Google Analytics