一、前言
在一些特殊场景需考虑在内存实现对象数组集合分页功能,如将新旧业务表数据合起来进行分页显示,由于新旧表的结构及关联关系表差异化比较大且复杂度比较高,如新旧逻辑基于同一查询条件合并起来再基于SQL分页(可以实现),嵌套层级过于复杂且不便与后期扩展优化,因此考虑将新旧表基于不同查询接口实现(分别提供可以sql业务逻辑dao接口方法),并将结果集合并在一起后,再通过内存算法根据起始页和页数进行展示。
二、代码示例
import java.lang.reflect.Array;@b@import java.util.ArrayList;@b@import java.util.Arrays;@b@import java.util.Collections;@b@import java.util.List;@b@import java.util.regex.Pattern;@b@import org.apache.commons.lang3.StringUtils;@b@@b@public class RAMPageUtil {@b@ @b@ private static int defaultMaxPageSize=10;@b@ @b@ /**@b@ * 根据传入的数组和页码返回分页后的数组@b@ * @param original 全量数据的数组@b@ * @param pageNum 页码@b@ * @param <T>@b@ * @return 返回分页后的对应页码页面的数据@b@ */@b@ public static <T> T[] page(T[] original, int pageNum) {@b@ return page(original,pageNum,defaultMaxPageSize);@b@ }@b@ /**@b@ * 根据传入的数组和页码返回分页后的数组@b@ * @param original 全量数据的数组@b@ * @param pageNum 页码@b@ * @param <T>@b@ * @return 返回分页后的对应页码页面的数据@b@ */@b@ public static <T> T[] page(T[] original, String pageNum) {@b@ if(StringUtils.isEmpty(pageNum) && !Pattern.compile("\\d+").matcher(pageNum).matches()) pageNum = "1";@b@ return page(original,Integer.parseInt(pageNum));@b@ }@b@ @b@ /**@b@ * 根据传入的数组和页码返回分页后的数组@b@ * @param original 全量数据的数组@b@ * @param pageNum 页码@b@ * @param pageSize 每页数据条数@b@ * @param <T>@b@ * @return 返回分页后的对应页码页面的数据@b@ */@b@ public static <T> T[] page(T[] original, int pageNum, int pageSize) {@b@ if(null==original || original.length == 0) return (T[]) Array.newInstance(original.getClass().getComponentType(), 0);@b@ if (pageNum <= 0) pageNum = 1;@b@ int from = (pageNum - 1) * pageSize;@b@ int to = pageNum * pageSize;@b@ if(to > original.length) to = original.length;@b@ if(from>=original.length || to <= from) return (T[]) Array.newInstance(original.getClass().getComponentType(), 0);@b@ return Arrays.copyOfRange(original, from, to);@b@ }@b@ @b@ /**@b@ * 根据传入的List和页码返回分页后的List@b@ * @param original 全量的List数据@b@ * @param pageNum 页码@b@ * @param <T>@b@ * @return 返回分页后的对应页码页面的List@b@ */@b@ public static <T> List<T> page(List<T> original,int pageNum){@b@ return page(original, pageNum,defaultMaxPageSize);@b@ }@b@ /**@b@ * 根据传入的数组和页码返回分页后的数组@b@ * @param original 全量数据的数组@b@ * @param pageNum 页码@b@ * @param <T>@b@ * @return 返回分页后的对应页码页面的数据@b@ */@b@ public static <T> List<T> page(List<T> original, String pageNum) {@b@ if(StringUtils.isEmpty(pageNum) && !Pattern.compile("\\d+").matcher(pageNum).matches()) pageNum = "1";@b@ return page(original,Integer.parseInt(pageNum));@b@ }@b@ /**@b@ * 根据传入的List和页码返回分页后的List@b@ * @param original 全量的List数据@b@ * @param pageNum 页码@b@ * @param pageSize 每页数据条数@b@ * @param <T>@b@ * @return 返回分页后的对应页码页面的List@b@ */@b@ public static <T> List<T> page(List<T> original,int pageNum,int pageSize){@b@ List list = new ArrayList<T>();@b@ Collections.addAll(list,page(original.toArray(),pageNum,pageSize));@b@ return list;@b@ }@b@@b@ public static void main(String[] args) {@b@ @b@ List<String> allDatas=Arrays.asList(new String[]{"1","2","3","4","5","6","7","8","9","10"});@b@ //从第2页开始,没有显示4条,预期结果:5,6,8,9@b@ System.out.println(page(allDatas,2,4));@b@ @b@ }@b@@b@}
控制台打印结果
[5, 6, 7, 8]