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);