- 浏览: 1222922 次
- 性别:
- 来自: 北京
文章分类
- 全部博客 (242)
- java (58)
- netty (14)
- javascript (21)
- commons (13)
- 读书笔记 (5)
- java测试 (6)
- database (5)
- struts2 (8)
- hibernate (6)
- english (27)
- spring (10)
- 生活 (4)
- 多线程 (4)
- 正则表达式 (1)
- 杂项 (1)
- maven (4)
- 数据库 (10)
- 学习笔记 (1)
- mongodb (1)
- 百度bcs (4)
- 云推送javasdk (2)
- webservice (3)
- IllegalAnnotationException: Two classes have the same XML type name (0)
- drools (3)
- freemarker (3)
- tomcat (1)
- html5 (2)
- mq (11)
- fastjson (3)
- 小算法 (2)
最新评论
-
longxitian:
https://www.cnblogs.com/jeffen/ ...
万恶的Mybatis的EnumTypeHandler -
asialee:
ddnzero 写道博主请问FileUtils这个类是哪个包的 ...
使用mockftpserver进行ftp测试 -
ddnzero:
博主请问FileUtils这个类是哪个包的?还是自己的呢?能放 ...
使用mockftpserver进行ftp测试 -
yizishou:
为什么会intMap.get("bbb") ...
浅谈System.identityHashCode -
liguanqun811:
感觉LogManager打开了所有的LogSegment(文件 ...
jafka学习之LogManager
以前开发一个系统,需要去多个系统去取数据,简单期间,比如a,b,c 三个系统,然后抓取过来,每页显示10条,比如a系统的总记录数是10,b是15,c是8条,起先的时候要去这三个系统去查总记录数,但是翻页的时候,有的时候就不需要去各个系统都取了,比如第一页,只要去a系统取数据就可以了,第二页到b系统取10条记录,第三页是在b系统取5条记录,在c系统取5条记录,第四页去c系统取3条记录。
之前在网上找过,但是没有找到,后来就自己写了一个算法,可以完美的解决这个问题,直接上代码吧。
package com.xxx.pc.common.pager; import java.util.ArrayList; import java.util.List; import com.xxx.pc.util.ProcessCenterConstants; public class PageBeanFactory { public final static int PAGE_MAX_SHOW_RECORDS = ProcessCenterConstants.DEFAULT_PAGE_SIZE; public final static int NO_DATA = -1; public final static int NOT_REQ = -2; public static int[] getPageIndex(int[] maxRecords, int pageNum) { // 第一页强制发送请求,用来获取最大值 if(pageNum == 1){ return initRets(maxRecords.length); } // 如果页码大于最大页码,则调整为最大页码 int fixPageNum = fixPageNum(maxRecords,pageNum); // 第一页强制发送请求,用来获取最大值 if(fixPageNum == 1){ return initRets(maxRecords.length); } int[] returns = generateRets(maxRecords,fixPageNum); // 标记不用发送请求的PageBean fixNoDataRets(maxRecords,fixPageNum,returns); return returns; } private static int[] generateRets(int[] maxRecords, int pageNum){ int maxPagesLength = maxRecords.length; int hasDisplayed = (pageNum - 1) * PAGE_MAX_SHOW_RECORDS; int[] returns = new int[maxPagesLength]; // 计算从什么地方翻页,并计算从什么地方要借数据 int i = 0; for (; i < maxPagesLength; i++) { hasDisplayed -= maxRecords[i]; if (hasDisplayed < 0) { break; } } for (int j = 0; j < maxPagesLength; j++) { if (j < i) { returns[j] = NO_DATA; } else if (j == i) { returns[j] = maxRecords[j] + hasDisplayed; } else { returns[j] = 0; } } return returns; } private static int fixPageNum(int[] maxPages,int pageNum){ // 负数处理 if(pageNum <= 0){ return 1; } int total = 0; for(int totalItem : maxPages){ total += totalItem; } int maxPage = total / PAGE_MAX_SHOW_RECORDS; if(total % PAGE_MAX_SHOW_RECORDS != 0){ maxPage++; } if(pageNum > maxPage){ pageNum = maxPage; } return pageNum; } private static void fixNoDataRets(int[] maxPages, int pageNum,int[] returns) { int maxPagesLength = maxPages.length; int shoudDisplayed = pageNum * PAGE_MAX_SHOW_RECORDS; int total = 0; int i = 0; for(; i < maxPagesLength; i++){ total += maxPages[i]; if(total >= shoudDisplayed){ break; } } for(int j = i + 1; j < maxPagesLength; j++){ returns[j] = NOT_REQ; } } private static int[] initRets(int maxLength){ int[] returns = new int[maxLength]; for(int i = 0; i < maxLength; i++){ returns[i] = 0; } return returns; } public static List<PageBean> create(int currentPage,int[] totals){ List<PageBean> pageBeans = new ArrayList<PageBean>(); int[] starts = getPageIndex(totals,currentPage); for(int startItem : starts){ PageBean pageBean = new PageBean(); pageBean.setStartRecords(startItem); pageBean.setMaxRecords(PAGE_MAX_SHOW_RECORDS); pageBeans.add(pageBean); } return pageBeans; } }
package com.xxx.pc.common.pager; import java.util.Map; public class PageBean implements java.io.Serializable{ private static final long serialVersionUID = 7233650799588141948L; private Map<String,Object> parameterMap; //生成分页时所带的参数键值对 private int startRecords = 0; //当前页数 private Integer maxRecords = PageBeanFactory.PAGE_MAX_SHOW_RECORDS; //一次查询的最大记录数 private int recordsCount = -1; public PageBean() {} public PageBean(int startRecords, Integer maxRecords) { this.startRecords = startRecords; this.maxRecords = maxRecords; } public Map<String, Object> getParameterMap() { return parameterMap; } public void setParameterMap(Map<String, Object> parameterMap) { this.parameterMap = parameterMap; } public int getStartRecords() { return startRecords; } public void setStartRecords(int startRecords) { this.startRecords = startRecords; } public Integer getMaxRecords() { return maxRecords; } public void setMaxRecords(Integer maxRecords) { this.maxRecords = maxRecords; } public int getRecordsCount() { return recordsCount; } public void setRecordsCount(int recordsCount) { this.recordsCount = recordsCount; } }
算法就不仔细讲了,比较大的一个原则是根据当前页,计算前一页应该展示多少条数据,计算每个数据源的起始记录数,一种是一个数据源没有数据了,一个是还不需要发请求。
评论
9 楼
asialee
2012-09-11
大家谁可以给一个view的例子,但是有一种情况,比如张三去登陆,看到的是张三的数据,李四登陆,看到的是李四的数据,这个view怎么建立,还请指教。
8 楼
asialee
2012-09-11
这个东西需求比较特殊的产物,去各个系统区抓取数据,但是为了安全期间,这些数据不允许在任何地方缓存,所以数据库建立view的情况也是不可取的。
7 楼
asialee
2012-09-11
xiaokang1582830 写道
多数据源码不是这样弄的,我很想知道什么样的项目会出现这样的情况?
我们项目就用到了,去各个系统区抓取数据,但是为了安全期间,这些数据不允许在任何地方缓存,所以数据库建立view的情况也是不可取的。
6 楼
asialee
2012-09-11
kerenbing 写道
如果翻页期间数据发生变化呢??????
翻页期间数据发生变化确实是有这个问题,这个东西是免不了的。
5 楼
kerenbing
2012-09-11
如果翻页期间数据发生变化呢??????
4 楼
defungo
2012-09-11
不可用,还不如建view呢
3 楼
lianglaiyang
2012-09-11
可不可以在一个库中建立一个VIEW呢,这样跟操作我们普通的表没有任何两样。
2 楼
xiaokang1582830
2012-09-11
多数据源码不是这样弄的,我很想知道什么样的项目会出现这样的情况?
1 楼
wukele
2012-09-11
如果要排序的话,不是完蛋了。呵呵
发表评论
-
maven的system scope的依赖在打包的时候不出现在lib里面的解决
2017-09-20 11:21 0上周遇到一个问题,一个sytem scope的依赖,在导出的 ... -
JAVA静态代码块
2015-04-07 16:26 1988今天遇到下面的代码 ... -
StringUtils.repeat函数赏析与疑问
2014-09-01 18:43 6007今天实现一个字符串拼接的一个需求,比如: ... -
java服务的培训ppt
2014-08-30 23:01 1532给应届生培训java web 服 ... -
给新人制定的java学习计划
2014-08-30 22:52 2426花了一点时间,给团队应届生和实习生制定 ... -
获取手机的mac地址
2014-04-10 22:20 3356与IP不同,MAC是指连接WIFI使用的无线网卡的物理地址, ... -
解决errorpage里面取不到Authentication的问题
2013-01-20 23:56 2387本人原创,发现一些网站无道德的抓取 ... -
SimpleDateFormat使用的时候的注意点
2012-12-06 20:59 2014今天在帮助同事查找一个项目bug的时候发现一个很奇怪 ... -
java和javascript的正则表达式有点不同
2012-11-06 18:54 1393今天在项目中遇 ... -
velocity 1.6.4的一个bug
2012-09-10 17:24 2136$.ajax()在Velocity中会冲突, 总之 ... -
使用stringBuffer和StringBuilder拼串要注意的问题
2012-07-30 17:30 8044今天在和同事排除一个问题的时候发现,从 ... -
java获取当月的工作日
2012-05-10 12:07 6037在这个记录一下,记录java获取某个月的工作日的代码,方便以 ... -
webservice引用传参
2012-04-19 19:38 1399http://www.blogjava.net/xylz/ar ... -
java获取当天的开始时间,当前周的开始时间
2012-04-16 17:31 19536在程序里面要获取当前的开始时间和结束时间,以及当前天 ... -
edtFTPj源码学习
2012-04-11 16:25 1187下面是edtFTPj的源码学习,下面的类图都是我自己亲手花的, ... -
ftp协议研究
2012-03-12 17:34 1213ACTIVE FTP OPERATION 1、客户端使用源 ... -
西安交通大学的错误日志
2011-12-14 13:30 969西安交大的网站报错了,记录下出错日志,改天研究一下。 HT ... -
tomcat的favicon.ico的用法
2011-12-01 20:00 21811. web.xml文件添加下面的mime-mapping ... -
htmlunit模拟sso登陆
2011-07-27 14:45 6897import java.io.IOException; ... -
万恶的Mybatis的EnumTypeHandler
2011-04-23 09:38 20402项目里面使用了Mybatis,然后里面一 ...
相关推荐
要求实现:页表的数据结构、分页式内存空间的分配及回收(建议采用位图法)、地址重定位、页面置换算法(从FIFO,LRU,NRU中任选一种)。 提示:可先用动态申请的方式申请一大块空间,然后假设该空间为内存区域,对该...
要求实现:页表的数据结构、分页式内存空间的分配及回收(建议采用位图法)、地址重定位、页面置换算法(从FIFO,LRU,NRU中任选一种)。 提示:可先用动态申请的方式申请一大块空间,然后假设该空间为内存区域,对该...
请求页式管理是一种常用的虚拟存储管理技术。本设计的目的是通过请求页式存储管理中页面置换算法模拟设计,了解虚拟存储技术的特点,掌握请求页式存储管理的页面置换算法。 (1)通过随机数产生一个指令序列,共320条...
操作系统(Operating System,OS),是一种软件,属于系统软件; 1、科普的观点 操作系统是计算机系统的管理和控制中心,它依照设计者制定的各种调度策略组织和管理计算机系统资源,使之能高效地运行。 2、功能...
2个目标文件 摘要:Java源码,文件操作,TCP,服务器 Tcp服务端与客户端的JAVA实例源代码,一个简单的Java TCP服务器端程序,别外还有一个客户端的程序,两者互相配合可以开发出超多的网络程序,这是最基础的部分。...
伪代码是一种用来书写程序或描述算法时使用的非正式、透明的表述方法。它是一 种编程语言。 A. 错误 B. 正确 -----------------选择: 3. COBOL是世界上最早出现的计算机高级程序设计语言。 A. 错误 B. 正确 ------...
5、场景对话的功能介绍:通过场景对话模块,开发者可快速搭建满足于不同场景下业务需求的多轮上下文对话,并实现对话式交互同自有产品业务、数据库以及第三方数据源的对接,实现产品服务体验升级。[2] 6、NLP知识库...
GWT Advanced Table 是一个基于 GWT 框架的网页表格组件,可实现分页数据显示、数据排序和过滤等功能! Google Tag Library 该标记库和 Google 有关。使用该标记库,利用 Google 为你的网站提供网站查询,并且可以...
GWT Advanced Table 是一个基于 GWT 框架的网页表格组件,可实现分页数据显示、数据排序和过滤等功能! Google Tag Library 该标记库和 Google 有关。使用该标记库,利用 Google 为你的网站提供网站查询,并且可以...
GWT Advanced Table 是一个基于 GWT 框架的网页表格组件,可实现分页数据显示、数据排序和过滤等功能! Google Tag Library 该标记库和 Google 有关。使用该标记库,利用 Google 为你的网站提供网站查询,并且可以...
GWT Advanced Table 是一个基于 GWT 框架的网页表格组件,可实现分页数据显示、数据排序和过滤等功能! Google Tag Library 该标记库和 Google 有关。使用该标记库,利用 Google 为你的网站提供网站查询,并且可以...
GWT Advanced Table 是一个基于 GWT 框架的网页表格组件,可实现分页数据显示、数据排序和过滤等功能! Google Tag Library 该标记库和 Google 有关。使用该标记库,利用 Google 为你的网站提供网站查询,并且可以...
GWT Advanced Table 是一个基于 GWT 框架的网页表格组件,可实现分页数据显示、数据排序和过滤等功能! Google Tag Library 该标记库和 Google 有关。使用该标记库,利用 Google 为你的网站提供网站查询,并且可以...
GWT Advanced Table 是一个基于 GWT 框架的网页表格组件,可实现分页数据显示、数据排序和过滤等功能! Google Tag Library 该标记库和 Google 有关。使用该标记库,利用 Google 为你的网站提供网站查询,并且可以...
GWT Advanced Table 是一个基于 GWT 框架的网页表格组件,可实现分页数据显示、数据排序和过滤等功能! Google Tag Library 该标记库和 Google 有关。使用该标记库,利用 Google 为你的网站提供网站查询,并且可以...
GWT Advanced Table 是一个基于 GWT 框架的网页表格组件,可实现分页数据显示、数据排序和过滤等功能! Google Tag Library 该标记库和 Google 有关。使用该标记库,利用 Google 为你的网站提供网站查询,并且可以...
GWT Advanced Table 是一个基于 GWT 框架的网页表格组件,可实现分页数据显示、数据排序和过滤等功能! Google Tag Library 该标记库和 Google 有关。使用该标记库,利用 Google 为你的网站提供网站查询,并且可以...
GWT Advanced Table 是一个基于 GWT 框架的网页表格组件,可实现分页数据显示、数据排序和过滤等功能! Google Tag Library 该标记库和 Google 有关。使用该标记库,利用 Google 为你的网站提供网站查询,并且可以...