寻找一个更好的解决方案然后是一个数组列表[关闭]
Posted
技术标签:
【中文标题】寻找一个更好的解决方案然后是一个数组列表[关闭]【英文标题】:Looking For A Better Solution Then An Array List [closed] 【发布时间】:2012-10-12 07:55:20 【问题描述】:目前我有一个有效的应用程序,但我想要一些建议,因为我觉得必须有更好的解决方案。我正在构建的网站上的一项功能是在用户搜索视频时向他们显示视频。搜索将通过单击"View All Dreamweaver Tutorials"
之类的链接来完成,搜索中的每个页面最多有 12 个视频,如果搜索查询更多,则可以单击链接转到其他页面。同样,一切正常,但我不喜欢我的逻辑,想听听是否有人对非常常见的任务有更好的解决方案。
这是我在用户单击链接时可能发送的参数示例...
search?tag=Dreamweaver&sub=CSS&page=1
其中tag
是主类别,sub
是子类别,page
是他们希望看到的当前页面。如果用户给出的页面超出范围,他们会被引导到一个特殊的屏幕。所以如果 servlet 看到了
search?tag=Dreamweaver&sub=CSS&page=1000
它会重定向用户!
现在,这是我的一些 servlet,它抓取这些发送的参数...
category = request.getParameter("tag");
subCategory = request.getParameter("sub");
page = Integer.parseInt(request.getParameter("page"));
ArrayList<Integer> startStop = Page.getPageStartStop(page);
int start = startStop.get(0);
int stop = startStop.get(1);
videoList = SearchDAO.getSearchResults(category, subCategory, start, stop);
这是我不喜欢我的逻辑的地方。如您所见,我首先获取参数。还算正常。但随后我调用 Page 类中的一个方法并将页码参数发送给它。所以对于这个例子,我将发送数字 1。然后该方法的目的是通过 if 语句找出数据库应该查询的起点和终点。所以这个方法看起来像这样。
public static ArrayList<Integer> getPageStartStop(int page)
ArrayList<Integer> startStop = new ArrayList<Integer>();
if (page == 1)
startStop.add(0);
startStop.add(12);
return startStop;
else if (page == 2)
startStop.add(11);
startStop.add(23);
return startStop;
......
因此,对于发送第 1 页的示例,该方法返回 0 表示开始,返回 12 表示停止,并将这些值发送到我的 DAO,以便查询知道从哪里开始和在哪里停止。下面是我的 DAO 的 sn-p,最后两个问号成为我的开始和停止。
preparedStatement = connection.prepareStatement("SELECT * FROM videos WHERE category = ? AND subCategory = ? LIMIT ?,?");
所以问题是 Page 类需要大量的 if 语句来预测页面并返回它们的结果。其他任何人都可以想到更好的方法来做到这一点。也许是一个通用的算法?很多网站都使用了这个功能,所以我知道必须有一种更简洁的方法来解决这个问题。老实说,这只是跳入我脑海的第一件事。非常感谢您的阅读!评论和答案将不胜感激!
【问题讨论】:
page = Integer.parseInt(request.getParameter("page"));
如果page
丢失,将抛出异常。您可能希望默认到第一页或其他内容,所以也许:page = Integer.parseInt(request.getParameter("page") != null ? request.getParameter("page") : "0");
如果页面丢失,他们永远不会到达那部分代码。上面执行了错误检查。
【参考方案1】:
也许你可以这样做
private static int ITEMS_PER_PAGE = 10;
public static List<Integer> getPageStartStop(int page)
int start = ITEMS_PER_PAGE * (page-1); // will return 0 for page 1, 10 for page 2, etc...
int stop = (ITEMS_PER_PAGE * page) + 1; // will return 11 for page 1, 21 for page 2, etc...
return Arrays.asList(new Integer[] start, stop );
确实,这称为分页。
【讨论】:
如果页面不是 1,这不起作用。如果它是 2,那么开始将是 12 * 2 所以 24。但是正确的答案应该是 11。 啊,好吧,我以为你会从第 0 页开始 :)。如果您的页面从 1 开始,您可以使用ITEMS_PER_PAGE * (page - 1)
和 (ITEMS_PER_PAGE - 1) + (ITEMS_PER_PAGE * (page - 1))
。
@gmustudent 如果您将页面视为“第一页为 0”、“第二页为 1”和“第三页为 2”,那么这非常有效。它生成“0-11”、“12-23”、“24-35”。如果要处理为“第一页为 1”、“第二页为 2”、“第三页为 3”,则将上述方案中的 page 替换为“page-1”即可。
这就是问题所在,它应该生成 (0,11) (11,23) (22,34) (33,45)
@gmustudent 什么...?它应该生成 11 作为第 2 页的开头和第 1 页的结尾,但是在下一页上,它将是 23 和 22?这毫无意义....即使您在问题中的示例也不遵循该逻辑。【参考方案2】:
public static ArrayList<Integer> getPageStartStop(int page)
ArrayList<Integer> startStop = new ArrayList<Integer>();
int NoOfItems = 12;
if (page > 0 && page < 1000)
startStop.add(page*NoOfItems - NoOfItems);//will return 0 for page 1
startStop.add(page*NoOfItems);//will return 12 for page 1
return startStop;
else
//your logic if page number exceeds than your set limit or it is less than 1
【讨论】:
为什么 start 是 (2*12 -12)=12 而 stop 是 (2*12)=24【参考方案3】:无需在数组中硬编码您的页面开始停止索引。想想当您决定在页面上显示更多元素时会发生什么。
使用firstResult
和maxResults
,其中firstResult
是您的页码,maxResults
是单页上的最大项目数。那你就可以firstResult * maxResults
了。
例如查看http://examples.javacodegeeks.com/enterprise-java/hibernate/pagination-in-hibernate-with-criteria-api。
【讨论】:
你能解释一下吗,我不完全理解它的危害。谢谢。 如果您的代码中的元素编号是硬编码的,那么您每次想要更改一页上显示的元素数量时都需要更改它。以上是关于寻找一个更好的解决方案然后是一个数组列表[关闭]的主要内容,如果未能解决你的问题,请参考以下文章