【Java】如何对列表进行手动分页

日常工作中多见用SQL配合公共类进行分页,写SQL是其中重点。

但有时拿到的就是全体数据,而不是几张表,这时就需要自己写代码进行分页了。

自行分页分排序和截取两步,这和SQL的逻辑是一致的。

以下是具体代码,其中核心是getPartList泛型静态函数。

package com.hy.lab.nosqlpaged;

import java.util.ArrayList;
import java.util.List;

public class Test {
    public static void main(String[] args){
        List<Emp> allEmps=new ArrayList<>();
        for(int i=0;i<100;i++){
            allEmps.add(new Emp("Emp"+i,20+i));
        }
        allEmps.sort((Emp a,Emp b)->a.getAge()-b.getAge());// 截取前的排序

        System.out.println("-------------------------第一页------------------------------");
        int page=1;
        int limit=10;
        int total=allEmps.size();
        List<Emp> p1Ls=getPartList(allEmps,page,10);
        for(Emp e:p1Ls){
            System.out.println(e);
        }

        System.out.println("-------------------------第三页------------------------------");
        page=3;
        limit=10;
        total=allEmps.size();
        List<Emp> p3Ls=getPartList(allEmps,page,10);
        for(Emp e:p3Ls){
            System.out.println(e);
        }

        System.out.println("-------------------------第十页------------------------------");
        page=10;
        limit=10;
        total=allEmps.size();
        List<Emp> p10Ls=getPartList(allEmps,page,10);
        for(Emp e:p10Ls){
            System.out.println(e);
        }

        System.out.println("-------------------------第二十页------------------------------");
        page=20;
        limit=10;
        total=allEmps.size();
        List<Emp> p20Ls=getPartList(allEmps,page,10);
        for(Emp e:p20Ls){
            System.out.println(e);
        }

        System.out.println("-------------------------第负一页------------------------------");
        page=-1;
        limit=10;
        total=allEmps.size();
        List<Emp> pz1Ls=getPartList(allEmps,page,10);
        for(Emp e:pz1Ls){
            System.out.println(e);
        }
    }

    /**
     * 按分页方式截取inLs的一部分
     * @param inLs 传入列表
     * @param page 页码
     * @param limit 页容量
     * @param <T> 元素类型
     * @return 指定页的元素列表
     */
    public static <T> List<T> getPartList(List<T> inLs,int page,int limit){
        page = (page <= 0) ? 1 : page;
        limit= (limit <= 0) ? 10 : limit;
        int total = inLs.size();

        return inLs.subList(Math.min((page - 1) * limit, total), Math.min(page * limit, total));
    }
}

输出:

-------------------------第一页------------------------------
Emp name=Emp0 age=20
Emp name=Emp1 age=21
Emp name=Emp2 age=22
Emp name=Emp3 age=23
Emp name=Emp4 age=24
Emp name=Emp5 age=25
Emp name=Emp6 age=26
Emp name=Emp7 age=27
Emp name=Emp8 age=28
Emp name=Emp9 age=29
-------------------------第三页------------------------------
Emp name=Emp20 age=40
Emp name=Emp21 age=41
Emp name=Emp22 age=42
Emp name=Emp23 age=43
Emp name=Emp24 age=44
Emp name=Emp25 age=45
Emp name=Emp26 age=46
Emp name=Emp27 age=47
Emp name=Emp28 age=48
Emp name=Emp29 age=49
-------------------------第十页------------------------------
Emp name=Emp90 age=110
Emp name=Emp91 age=111
Emp name=Emp92 age=112
Emp name=Emp93 age=113
Emp name=Emp94 age=114
Emp name=Emp95 age=115
Emp name=Emp96 age=116
Emp name=Emp97 age=117
Emp name=Emp98 age=118
Emp name=Emp99 age=119
-------------------------第二十页------------------------------
-------------------------第负一页------------------------------
Emp name=Emp0 age=20
Emp name=Emp1 age=21
Emp name=Emp2 age=22
Emp name=Emp3 age=23
Emp name=Emp4 age=24
Emp name=Emp5 age=25
Emp name=Emp6 age=26
Emp name=Emp7 age=27
Emp name=Emp8 age=28
Emp name=Emp9 age=29

EMP类:

package com.hy.lab.nosqlpaged;

public class Emp{
    private String name;
    private int age;

    public Emp(String name, int age){
        this.name=name;
        this.age=age;
    }

    public String toString(){
        return String.format("Emp name=%s age=%d",name,age);
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public int getAge() {
        return age;
    }

    public void setAge(int age) {
        this.age = age;
    }
}

END

 

参考资料:https://www.cnblogs.com/miracle-luna/p/15037742.html

posted @ 2022-05-13 12:09  逆火狂飙  阅读(1607)  评论(0编辑  收藏  举报
生当作人杰 死亦为鬼雄 至今思项羽 不肯过江东