List分页 + 排序

BearKin 2010-01-28 02:44:26
午睡过后写了个实现List分页的小DD 不复杂 不过有点小小疑惑 代码如下:

package test;

import java.util.Collections;
import java.util.Comparator;
import java.util.List;

/**
* 分页类
*
* @author Lv9
* @since 2010.1.28
*/
public class ListSplitPage<T> {
private final List<T> list; // 记录
private final int pageSize;// 每页显示的记录数
private final int pageNum;// 总页数

private int currentPage = 1;// 当前页
private int fromIndex = 0;// 记录起始索引
private int toIndex = 0;// 记录结束索引

public ListSplitPage(List<T> list, Comparator<T> comparator, int pageSize) {
this.list = list;
this.pageSize = pageSize;

if (this.pageSize < 0) {
throw new RuntimeException("每页显示的记录数不能小于0");
} else {
if (list.size() % pageSize == 0)
this.pageNum = list.size() / pageSize;
else
this.pageNum = list.size() / pageSize + 1;
}
Collections.sort(list, comparator);
}

/**
* 分页
*
* @param currentPage
* 当前页数
*/
public List<T> getList(int currentPage) {
if (currentPage > pageNum || currentPage < 1) {
throw new RuntimeException("当前页数不能大于总页数并且不能小于1");
} else {
this.currentPage = currentPage;
this.fromIndex = (this.currentPage - 1) * pageSize;

if (this.currentPage == pageNum) {
this.toIndex = list.size();
} else {
this.toIndex = this.currentPage * pageSize;
}
return list.subList(fromIndex, toIndex);
}
}

/**
* 获得记录起始索引
*/
public int getFromIndex() {
return fromIndex;
}

/**
* 获得记录结束索引
*/
public int getToIndex() {
return toIndex;
}

/**
* 获得总页数
*/
public int getPageNum() {
return pageNum;
}

/**
* 获得每页显示的记录数
*/
public int getPageSize() {
return pageSize;
}

/**
* 获得当前页
*/
public int getCurrentPage() {
return currentPage;
}

/**
* 获得记录集合
*/
public List<T> getList() {
return this.list;
}
}

/**
* Comparator工厂
*
* @author Lv9
* @since 2010.1.28
*/
class GameObjectComparatorFactory {

private static Comparator<GameObject> idComparator = new Comparator<GameObject>() {
public int compare(GameObject o1, GameObject o2) {
if (o1.getId() > o2.getId())
return 1;
else if (o1.getId() == o2.getId())
return 0;
else
return -1;
}
};

private static Comparator<GameObject> leaveComparator = new Comparator<GameObject>() {
public int compare(GameObject o1, GameObject o2) {
if (o1.getLeave() > o2.getLeave())
return 1;
else if (o1.getLeave() == o2.getLeave())
return 0;
else
return -1;
}
};

public static Comparator<GameObject> getIdComparator() {
return idComparator;
}

public static Comparator<GameObject> getLeaveComparator() {
return leaveComparator;
}
}

class GameObject {
private Integer id;
private Integer leave;

public GameObject() {

}

public GameObject(Integer id, Integer leave) {
this.id = id;
this.leave = leave;
}

public Integer getId() {
return id;
}

public void setId(Integer id) {
this.id = id;
}

public Integer getLeave() {
return leave;
}

public void setLeave(Integer leave) {
this.leave = leave;
}

public String toString() {
return "id:" + id + ",leave:" + leave;
}
}

运行这个测试

package test;

import java.util.ArrayList;
import java.util.List;
import java.util.Random;
import java.util.Scanner;

public class Test {
public static void main(String[] args) {
List<GameObject> list = new ArrayList<GameObject>();
Random random = new Random();

for (int i = 0; i < 50; i++) {
list.add(new GameObject(i, random.nextInt(100)));
}
ListSplitPage<GameObject> pagelist = new ListSplitPage<GameObject>(
list, GameObjectComparatorFactory.getIdComparator(), 8);
System.out.println("当前页为:" + pagelist.getCurrentPage() + "\n总页数为:"
+ pagelist.getPageNum() + "\n总记录数为:" + list.size());
while (true) {
displayList(pagelist.getList(getPage()));
}
}

public static int getPage() {
Scanner scanner = new Scanner(System.in);
System.out.print("请输入当前页码:");
return scanner.nextInt();
}

public static void displayList(List<?> list) {
for (Object object : list) {
System.out.println(object);
}
}
}



小的代码写的不咋地 不过我想到个问题 用LIST分页的话 如果说在分页过程中 在外面把这个LIST里面的元素稍微搞那么一下 里面肯定会出错 这个该咋处理..
...全文
679 29 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
29 条回复
切换为时间正序
请发表友善的回复…
发表回复
BearKin 2010-01-29
  • 打赏
  • 举报
回复
[Quote=引用 28 楼 aaronbamboo 的回复:]
引用楼主 bearkin 的回复:

        }else {if (list.size()% pageSize==0)this.pageNum= list.size()/ pageSize;elsethis.pageNum= list.size()/ pageSize+1;
        }



从上面的代码来看,好像你把未分页前的信息都放到list中了,这样好像不太合适吧,失去了分页的意义
[/Quote]

那要放到什么地方?..
Aaronbamboo 2010-01-29
  • 打赏
  • 举报
回复
[Quote=引用楼主 bearkin 的回复:]

}else {if (list.size()% pageSize==0)this.pageNum= list.size()/ pageSize;elsethis.pageNum= list.size()/ pageSize+1;
}

[/Quote]

从上面的代码来看,好像你把未分页前的信息都放到list中了,这样好像不太合适吧,失去了分页的意义
BearKin 2010-01-29
  • 打赏
  • 举报
回复
[Quote=引用 26 楼 dinghun8leech 的回复:]
引用 25 楼 bearkin 的回复:
奇怪 我的帖子咋没其他人来顶呢 难道是名字不够诱人?..

建议将帖子加分至100~200分,才是解决人气问题的根本。
[/Quote]

如果没人来的话 分给谁呢? 无满意结帖?
dinghun8leech 2010-01-29
  • 打赏
  • 举报
回复
[Quote=引用 25 楼 bearkin 的回复:]
奇怪 我的帖子咋没其他人来顶呢 难道是名字不够诱人?..
[/Quote]
建议将帖子加分至100~200分,才是解决人气问题的根本。
BearKin 2010-01-29
  • 打赏
  • 举报
回复
[Quote=引用 24 楼 dinghun8leech 的回复:]
引用 23 楼 bearkin 的回复:
别用ARRAYLIST你用 LINKEDLIST看看? 这个for each默认是用Iterator实现 说不定你用ARRAYLIST的GET方法比较快呢..

我回家试试。
[/Quote]

奇怪 我的帖子咋没其他人来顶呢 难道是名字不够诱人?..
dinghun8leech 2010-01-29
  • 打赏
  • 举报
回复
[Quote=引用 23 楼 bearkin 的回复:]
别用ARRAYLIST你用 LINKEDLIST看看? 这个for each默认是用Iterator实现 说不定你用ARRAYLIST的GET方法比较快呢..
[/Quote]
我回家试试。
BearKin 2010-01-29
  • 打赏
  • 举报
回复
[Quote=引用 22 楼 dinghun8leech 的回复:]
那个for循环确实简化了很多,不过我个人比较小抠儿,一丁点儿效率我都要,哪怕多写点代码。
[/Quote]

别用ARRAYLIST你用 LINKEDLIST看看? 这个for each默认是用Iterator实现 说不定你用ARRAYLIST的GET方法比较快呢..
dinghun8leech 2010-01-29
  • 打赏
  • 举报
回复
那个for循环确实简化了很多,不过我个人比较小抠儿,一丁点儿效率我都要,哪怕多写点代码。
BearKin 2010-01-29
  • 打赏
  • 举报
回复

package test;

public class HelloWorld {
static {
System.out.println("Hello Word");
System.exit(0);
}
}


HelloWorld..
BearKin 2010-01-29
  • 打赏
  • 举报
回复
[Quote=引用 18 楼 dinghun8leech 的回复:]
为了拿点儿积分,我这个小菜很寒酸的强挤点儿意见出来吧。
1.list等实例变量是靠唯一的构造方法进行赋值,不存在引用再次改变的情况,因此这里用final我实在没想出来他有啥意义。
2.排序方法似乎还可以写活一点,扩展一下参数列表,接收一个字段名,和一个排序方向,这样就能根据调用者指定的排序字段和顺序排序,工厂也可以省了。
3.注释中的参数我个人一般喜欢写参数类型(@param String 啥啥啥),而不是参数名(@param name 啥啥啥),因为我觉得有时候参数列表长了,而eclipse也提示不周,编码时就很难快速的为调用的方法填入准确类型的参数。另外,代码中注释不全。
4.对于设计来说,我觉得既然罗列出来的数据是可能被修改的,且数据存于此分页工具对象中是可供多次查询和暂存一段时间的,因此在多个人同一时间(甚至无需并发)访问同样的数据并修改,那很可能看到的都是与数据源中不符的数据。所以这个东东我看没啥用途
另外我一直怀疑那种新式的for循环写法在对应集合类时性能不如传统for循环写法,一测试,性能还真有些区别。可惜我只能测试一百万个,两百万个我jvm就再也没内存创建新对象了,否则数据更准确。

Java codeList<String> string=new ArrayList<String>();for (int i=0;i<1000000;i++) {
string.add(new String());
}long begin= System.currentTimeMillis();for (String str : string) {
str.toString();
}
System.out.println("for 循环1 遍历百万个String用去:"+ (System.currentTimeMillis()- begin)+"s");
begin= System.currentTimeMillis();int size= string.size();for (int i=0;i<size;i++) {
string.get(i).toString();
}
System.out.println("for 循环2 遍历百万个String用去:"+ (System.currentTimeMillis()- begin)+"s");


----------------------
一家之言啊,水平不佳,能卖的都卖出来了,不妥之处别忘了提出。更别忘了给分,我很穷。
[/Quote]
1.习惯
2.接受(坦白说我更想随便输入个值 在方法内部一判断 然后自动生成排序代码 不是根据一个参数选择排哪个..)
3.平时偶是不写注释的...下回我会改正的
4.需求!
5.我更想看看你怎么写的 新的for each重点不是在性能 而是在简化 我们平时做一个循环需要写一些多余的代码(并且写的都那一个样) 所以 这个纯粹就是简化..

恩 给你分分
swit1983 2010-01-28
  • 打赏
  • 举报
回复
不明白楼主的意思,是说的线程安全吗?不知道什么叫外面把这个LIST里面的元素稍微搞那么一下?
dinghun8leech 2010-01-28
  • 打赏
  • 举报
回复
为了拿点儿积分,我这个小菜很寒酸的强挤点儿意见出来吧。
1.list等实例变量是靠唯一的构造方法进行赋值,不存在引用再次改变的情况,因此这里用final我实在没想出来他有啥意义。
2.排序方法似乎还可以写活一点,扩展一下参数列表,接收一个字段名,和一个排序方向,这样就能根据调用者指定的排序字段和顺序排序,工厂也可以省了。
3.注释中的参数我个人一般喜欢写参数类型(@param String 啥啥啥),而不是参数名(@param name 啥啥啥),因为我觉得有时候参数列表长了,而eclipse也提示不周,编码时就很难快速的为调用的方法填入准确类型的参数。另外,代码中注释不全。
4.对于设计来说,我觉得既然罗列出来的数据是可能被修改的,且数据存于此分页工具对象中是可供多次查询和暂存一段时间的,因此在多个人同一时间(甚至无需并发)访问同样的数据并修改,那很可能看到的都是与数据源中不符的数据。所以这个东东我看没啥用途
另外我一直怀疑那种新式的for循环写法在对应集合类时性能不如传统for循环写法,一测试,性能还真有些区别。可惜我只能测试一百万个,两百万个我jvm就再也没内存创建新对象了,否则数据更准确。

List<String> string = new ArrayList<String>();
for (int i=0;i<1000000;i++) {
string.add(new String());
}
long begin = System.currentTimeMillis();
for (String str : string) {
str.toString();
}
System.out.println("for 循环1 遍历百万个String用去:" + (System.currentTimeMillis() - begin) + "s");
begin = System.currentTimeMillis();
int size = string.size();
for (int i=0;i<size;i++) {
string.get(i).toString();
}
System.out.println("for 循环2 遍历百万个String用去:" + (System.currentTimeMillis() - begin) + "s");



----------------------
一家之言啊,水平不佳,能卖的都卖出来了,不妥之处别忘了提出。更别忘了给分,我很穷。
BearKin 2010-01-28
  • 打赏
  • 举报
回复
多整齐啊 运行下就明白了
chinarenzhou 2010-01-28
  • 打赏
  • 举报
回复
太多了,看起来太费劲
dinghun8leech 2010-01-28
  • 打赏
  • 举报
回复
[Quote=引用 13 楼 bearkin 的回复:]
我套了CODE 所以看起来比较好看(好看..)
技术分 不能乱给 拿出意见 我给..
[/Quote]
下班回家好好看看,等着我啊
Sieben77 2010-01-28
  • 打赏
  • 举报
回复
偶很菜,so藏了。。好好学习。。谢谢lz分享~~~
BearKin 2010-01-28
  • 打赏
  • 举报
回复
[Quote=引用 11 楼 dinghun8leech 的回复:]
又回来看了两分钟,看懂啥意思了。
说明bk的代码可读性还是不错的就看bk想要啥方面的意见了。
给我点分吧,咱不bs你了。
[/Quote]

我套了CODE 所以看起来比较好看(好看..)

技术分 不能乱给 拿出意见 我给..
BearKin 2010-01-28
  • 打赏
  • 举报
回复
[Quote=引用 10 楼 yetaodiao 的回复:]
晒代码 好

看看别人的思想  好进步
[/Quote]

我晒之前还是有一定的思想斗争的 不过我现在不怕别人骂我蠢了 反正这件事早就不是秘密了
dinghun8leech 2010-01-28
  • 打赏
  • 举报
回复
又回来看了两分钟,看懂啥意思了。
说明bk的代码可读性还是不错的就看bk想要啥方面的意见了。
给我点分吧,咱不bs你了。
  • 打赏
  • 举报
回复
晒代码 好

看看别人的思想 好进步
加载更多回复(9)

67,550

社区成员

发帖
与我相关
我的任务
社区描述
J2EE只是Java企业应用。我们需要一个跨J2SE/WEB/EJB的微容器,保护我们的业务核心组件(中间件),以延续它的生命力,而不是依赖J2SE/J2EE版本。
社区管理员
  • Java EE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧