ArrayList 的subList 分页实现

1.

有些排序在sql层面处理不了,只能在代码中处理,假设有如下场景:

根据 省份 名称 排完序后,进行分页展示,问题是 省份名称 是通过第三方接口来的,不能通过 sql 排序,然后通过 pageHelper 的limit  分页

(limit ( pageNum-1) * pageSize,pageSize )

比如 主数据 有: 学生名字,手机号,成绩, 省份guid

List<Student> students = studentService.getList();

// 调用第三方 根据省份 guid 获取省份名称,并填充到每个 Student 对象里

// java 层面 根据 省份名称进行  排序

// 排完序之后进行分组

说明:精简版的代码在最下面

1.

语法:

//        语法        
//
//        subList(int fromIndex, int toIndex)
//
//        fromIndex:用于指定新列表的起始点(包括该点)。
//
//        toIndex:用于指定新列表的结束点(不包括该点)。
//        所以截取的长度刚好是 toIndex  - fromIndex

//        注意:返回的是父集合的一部分视图,是视图、是视图、是视图,重要的
//
//        事说3遍,无论改变那个集合,另一个都会随动。(解决方法很简单,
//
//        开辟一个新的集合对象去接受就OK了

 

改变子集,大集合也会改变:

demo:

  List<String> list = new ArrayList<String>();
        //向列表中添加数据
        list.add("1");
        list.add("2");
        list.add("3");
        list.add("4");
        list.add("5");
        list.add("6");
        list.add("7");
        //迭代list
        Iterator<String> its = list.iterator();
        System.out.println("集合中所有元素对象:");
        //循环遍历集合
        while (its.hasNext()) {
            //输出集合内容
            System.out.print(its.next() + "  ");
        }
        //获取子列表 截取长度为2 ,在from的基础上 加 2 作为 endIndex 预测结果:d e
        List<String> subList = list.subList(3, 5);

        System.out.println("\n截取集合中部分元素:");
        Iterator it = subList.iterator();
        while (it.hasNext()) {
            System.out.print(it.next() + "  ");
        }

        System.out.println("\n-------------------after  subList----------------");
        Iterator<String> afterits = list.iterator();
        //循环遍历集合
        while (afterits.hasNext()) {
            //输出集合内容
            System.out.print(afterits.next() + "  ");
        }


        // 在 子集合里  添加新元素 ,会改变 大集合
        subList.add("8");
        System.out.println("\n-------------------after add  subList----------------");
        Iterator<String> afteraddits = list.iterator();
        //循环遍历集合
        while (afteraddits.hasNext()) {
            //输出集合内容
            System.out.print(afteraddits.next() + "  ");
        }
        // 3
        System.out.println(subList.size());
        // 8
        System.out.println(list.size());

 

测试结果如下:

集合中所有元素对象:
1  2  3  4  5  6  7  
截取集合中部分元素:
4  5  
-------------------after  subList----------------
1  2  3  4  5  6  7  
-------------------after add  subList----------------
1  2  3  4  5  8  6  7  

3
8

 

分页:(最后一页注意下标越界,如果第一页是最后一页,也当是最后一页处理,防止下标越界)

 

第一页  :

 List<String> list = new ArrayList<String>();
        //向列表中添加数据
        list.add("1");
        list.add("2");
        list.add("3");
        list.add("4");
        list.add("5");
        list.add("6");
        list.add("7");

        // 测试
        List  topFiveList = list.subList(0, 0+5);
        Iterator<String> topFive = topFiveList.iterator();
        System.out.println("\n------------------ 第 1 页 ,每页显示5条 数据 截取5个----------------");
        //循环遍历集合
        while (topFive.hasNext()) {
            //输出集合内容
            System.out.print(topFive.next() + "  ");
        }

显示结果:


------------------ 第 1 页 ,每页显示5条 数据 截取5个----------------
1  2  3  4  5  

通用的处理方法:(防止下标越界)

 


        List<String> list = new ArrayList<String>();
        //向列表中添加数据
        list.add("1");
        list.add("2");
        list.add("3");
        list.add("4");
        list.add("5");
        list.add("6");
        list.add("7");

        // fromIndex  = (pageNum - 1) * pageSize
        //
        //  结束index
        //   ① 中间页 :endIndex = fromIndex + pageSize;  endIndex  是不包含的
        //   ② 最后一页:(or 只有一页): endIndex = total

        // 记住一个结论: endIndex - fromIndex 为 当前需要展示的记录数


        // 通用分页(包括最后一页越界的处理)
        System.out.println("\n------------------ 通用 分页 ---------------");
        int pageNum = 1;
        int pageSize = 10;
        int total  = list.size();
        if (((pageNum-1) * pageSize) > total ) {
         throw  new RuntimeException("my custome exception : parameter is illegal ......") ;
        }

        // 最后一页特殊处理
        // 计算总页数
        int totalPage = total/pageSize + (total%pageSize==0?0:1);
        if (pageNum == totalPage ) {
            // 取的 index  5 6
            // 但最后 endIndex 为 7,这样保证截取的是 2 条数据
            // endIndex  =  total
            int fromIndex =  (pageNum-1) * pageSize;
            int endIndex = total;
            List  lastPageList = list.subList(fromIndex,endIndex);
            Iterator lastPageIte = lastPageList.iterator();
            System.out.println("\n---------lastPage--------- 第 "+ pageNum +" 页 ,每页显示"+pageSize+"条 数据 ----------------");
            //循环遍历集合
            while (lastPageIte.hasNext()) {
                //输出集合内容
                System.out.print(lastPageIte.next() + "  ");
            }
        }else {
            // 第一页和中间页
            int fromIndex = (pageNum-1) * pageSize ;
            int endIndex = fromIndex + pageSize ;
            List  fiveToTenList = list.subList( fromIndex,endIndex);
            Iterator<String> fiveToTen = fiveToTenList.iterator();
            System.out.println("\n---------第一页 or 中间页--------- 第 "+ pageNum +" 页 ,每页显示"+pageSize+"条 数据 ----------------");
            //循环遍历集合
            while (fiveToTen.hasNext()) {
                //输出集合内容
                System.out.print(fiveToTen.next() + "  ");
            }
        }

结果:

------------------ 通用 分页 ---------------

---------lastPage--------- 第 1 页 ,每页显示10条 数据 ----------------
1  2  3  4  5  6  7  
Process finished with exit code 0

 

精简后的代码如下:

 //页码
        int pageNum=1;
        //每页显示的数量
        int pageSize=10;
        int total=list.size();
        int pageTotal = (total / pageSize) + ((total % pageNum > 0) ? 1 : 0);

        int startIndex = (pageNum-1) * pageSize;
        // endIndex 是要区分是不是最后一页,防止下标越界
        int endIndex = pageNum==pageTotal ? total : pageNum * pageSize;

        List<String> updateList=list.subList(startIndex,endIndex);

防止报异常:

 int pageTotal = (total / pageSize) + 1;
        // 防止startIndex  大于total
        int startIndex = (pageNum-1) * pageSize <= total ? (pageNum-1) * pageSize : 0;
        // endIndex 是要区分是不是最后一页,防止下标越界
        int endIndex = pageNum >=pageTotal ? total : pageNum * pageSize;
        List<CwjkprojectVO> resultList=list.subList(startIndex,endIndex);

 

 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值