`
bianrongxin
  • 浏览: 102702 次
  • 性别: 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  

不错啊,挺好用的。

相关推荐

    01标准分段批量处理(done).zip

    在Java等编程语言中,通常会创建一个工具类来实现这个功能,该工具类会包含对数据进行分段、添加、修改、查询和删除的方法。 首先,我们需要理解分段的概念。分段通常是基于数据的某种标识,如ID,将数据划分为若干...

    java必备知识点大全.pdf

    JDBC分段批量提交时出现异常的处理:可以通过设置合适的批处理大小和异常捕获处理。 JDBC批量处理数据:JDBC提供批量更新功能,可以一次性发送多个更新请求。 Oracle分页:Oracle提供了ROWNUM和ROWID进行分页查询...

    Java集合容器面试题(2022最新版)-重点.docx

    - 使用`list.toArray()`将`List`转为数组。 #### ArrayList与LinkedList的区别 - **ArrayList**:基于数组实现,随机访问快,增删慢。 - **LinkedList**:基于链表实现,增删快,随机访问慢。 #### 多线程场景下...

    Java集合框架完整说明便于了解集合

    Java集合框架是Java编程语言中不可或缺的部分,它提供了一种高效、灵活的数据组织方式。集合框架包括了多种接口和类,如List、Set、Map,它们各自有着独特的用途和实现方式。 1. List接口:List是有序的集合,允许...

    02-Java集合容器面试题(2020最新版)-重点.pdf

    - **Array与ArrayList**:`Array`用于存储固定大小的数组,`ArrayList`则用于存储可变大小的列表。 - **Comparable与Comparator**:`Comparable`接口用于定义对象自身的排序规则,`Comparator`接口用于定义外部的...

    30个Java经典的集合面试题!.zip

    ConcurrentHashMap是Java并发编程中的线程安全HashMap,它通过分段锁机制实现了高效并发。 6. **如何在ArrayList中实现线程安全?** 可以使用Collections.synchronizedList()将ArrayList包装为线程安全的列表,...

    Java 集合面试稳稳的.pdf

    当链表长度超过8,且数组大小超过64时,HashMap会将链表转化为红黑树。HashTable是线程安全的,内部实现与HashMap类似,但所有的公共方法都同步了,所以性能较低。ConcurrentHashMap是线程安全且高效的实现,它采用...

    java超有用的面试题目

    - **Collections.sort**:对于`List`的排序,`Collections.sort()` 方法内部实际上是基于归并排序的一个变种——TimSort。这种排序算法首先会检查列表是否已经部分有序,如果是,则直接利用这种有序性进行排序,这...

    Java后端技术面试汇总-2019

    - **Java序列化和反序列化**:序列化是将对象转换为字节流以便持久化或传输,而反序列化则是相反过程。 - **Object类中常见的方法**:wait()、notify()等用于线程同步。 - **Java的平台无关性**:通过Java虚拟机...

    Java8新特性Lambda表达式的一些复杂用法总结

    代码中提到的`ListUtils.partition(list, batchSize)`是Apache Commons Collections提供的一个方法,它将列表分割成指定大小的子列表。这个功能也可以通过Java 8的Lambda表达式实现,但Apache Commons提供了更简单...

    java面试常见基础(深层次,高级研发)

    List&lt;String&gt; list = new ArrayList(1000000); ``` #### 16. Hashmap和 concurrentHashmap除了线程安全 还有什么区别,put的时候是怎么处理的。 - **HashMap**:非线程安全,效率较高。 - **ConcurrentHashMap**:...

    JAVA面试题总览[整理].pdf

    2. String类是final的,不能被继承,因为String是Java中非常基础且重要的类,为了保证其安全性和性能,设计者将其设为不可继承。 3. String、StringBuffer和StringBuilder都是用来处理字符串的。String是不可变的,...

    JSP中实现分页功能

    在Java服务器页面(JSP)中实现分页功能是一项常见的任务,特别是在开发Web应用程序时,尤其是在数据量较大的情况下,为了提高用户体验,需要将大量数据分段显示。分页不仅可以优化加载速度,还可以使得用户更容易...

    01-JAVA岗位笔试题(A卷)附答案

    `ConcurrentHashMap`是Java提供的一个支持高并发访问的哈希表实现,它使用了一种称为**分段锁**的技术来提高并发性能。具体来说: - 使用**哈希表**作为基本的数据结构。 - 使用**链表**或**红黑树**作为哈希表中每...

    2019年一线互联网公司Java高级面试题总结

    根据给定文件的信息,我们可以将知识点分为几个大类:Java基础知识、JVM相关知识、Spring框架、数据库技术、分布式系统及缓存管理等。接下来,我会逐一解析这些知识点。 ### Java基础知识 #### 1. HashCode与...

    java面试知识

    - **java.util**:提供了大量实用工具类,如集合框架(List、Map等)、日期操作等。 - **java.io**:提供用于输入/输出的类,如FileInputStream、OutputStreamWriter等。 - **java.sql**:为SQL数据库访问提供API...

    面试题完整套题.docx

    - List是有序且可重复的集合,允许精确控制每个元素的插入位置,并能删除指定位置的元素。 - 常见的List实现包括ArrayList、LinkedList和已过时的Vector。 3. **HashMap** - HashMap是非同步的,允许null键值对...

    freemarker总结

    该指令用于导入FreeMarker模板中的所有变量,并将该变量放置在指定的Map对象中,import指令的语法格式如下: 上面的代码将导入/lib/common.ftl模板文件中的所有变量,将这些变量放置在一个名为com的Map对象中. 创建...

    Kafka高频面试题系列之四(30道).docx

    2. **最大消息大小**: Kafka 可以接收的最大消息大小约为 1000000 字节,这允许处理大量数据。 3. **副本不在 ISR 中的意义**: ISR (In-Sync Replicas) 是一组与领导者保持同步的副本。如果副本不在 ISR 中,表示它...

    AndroidWheelChart:Android的交互式轮图

    - **高度自定义**: 支持自定义每个分段的颜色、大小、文本等属性,可以根据需求定制出各种样式。 - **交互性强**: 用户可以触摸屏幕旋转轮盘,支持滑动和点击事件,提供良好的用户体验。 - **平滑动画**: 内置平滑...

Global site tag (gtag.js) - Google Analytics