Java 寻找比数组列表更好的解决方案

Java 寻找比数组列表更好的解决方案,java,servlets,dao,Java,Servlets,Dao,目前我有一个工作的应用程序,但我想一些建议,因为我觉得必须有一个更好的解决方案。我正在构建的网站上的一个功能是在用户搜索视频时向他们显示视频。通过单击链接(如“查看所有Dreamweaver教程”)可以完成搜索,搜索中的每个页面最多有12个视频,如果搜索查询了更多视频,则可以单击链接转到其他页面。再说一遍,一切都很好,但我不喜欢我的逻辑,我想听听是否有人对一项非常常见的任务有更好的解决方案 下面是一个当用户单击链接时我可能发送的参数示例 search?tag=Dreamweaver&su

目前我有一个工作的应用程序,但我想一些建议,因为我觉得必须有一个更好的解决方案。我正在构建的网站上的一个功能是在用户搜索视频时向他们显示视频。通过单击链接(如
“查看所有Dreamweaver教程”
)可以完成搜索,搜索中的每个页面最多有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类需要很多if语句来预测页面并返回结果。其他人能想出更好的方法吗。也许是一个普通的算法?很多网站都使用这个功能,所以我知道一定有更干净的方法来解决这个问题。老实说,这只是我想到的第一件事。非常感谢你的阅读!如有任何意见和回答,将不胜感激

也许你可以这样做

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 });
}
private static int ITEMS\u PER\u PAGE=10;
公共静态列表getPageStartStop(int页){
int start=ITEMS_PER_PAGE*(第1页);//将在第1页返回0,在第2页返回10,以此类推。。。
int stop=(ITEMS\u PER\u PAGE*PAGE)+1;//将在第1页返回11,在第2页返回21,以此类推。。。
返回Arrays.asList(新整数[]{start,stop});
}

实际上,这称为分页。

无需在数组中硬编码页面的开始-停止索引。想想当你决定在页面上显示更多元素时会发生什么

使用
firstResult
maxResults
其中
firstResult
是您的页码,
maxResults
是单个页面上的最大项目数。然后您可以执行
firstResult*maxResults

例如,请参阅。

公共静态数组列表getPageStartStop(int页)
{
ArrayList startStop=新的ArrayList();
int NoOfItems=12;
如果(页面>0&&页面<1000)
{
startStop.add(page*NoOfItems-NoOfItems);//将为第1页返回0
startStop.add(page*NoOfItems);//将在第1页返回12
返回startStop;
}否则{
//如果页码超过设置的限制或小于1,则返回逻辑
}
}

page=Integer.parseInt(request.getParameter(“page”)页面
,则code>将引发异常。您可能希望默认为第一页或其他内容,因此可能:
page=Integer.parseInt(request.getParameter(“page”)!=null?request.getParameter(“page”):“0”)如果页面丢失,它们永远不会到达代码的该部分。上面执行了错误检查。如果页面不是1,则这不起作用。如果是2,那么开始的时间是12*2,所以是24。正确的答案应该是11。啊,我想你应该从第0页开始:)。如果你的页面从1开始,你可以使用
ITEMS\u PER\u PAGE*(PAGE-1)
(ITEMS\u PER\u PAGE-1)+(ITEMS\u PER\u PAGE*(PAGE-1))
@gmustudent如果你将页面视为“第一页是0”、“第二页是1”和“第三页是2”,那么这是完美的。它的分类为“0-11”、“12-23”、“24-35”。如果您想将“第一页是1”、“第二页是2”、“第三页是3”,那么在上述解决方案中,只需将页面替换为“第1页”。这就是问题所在,它应该生成(0,11)(11,23)(22,34)(33,45)@gmustudent what。。。?它应该生成11作为第2页的开始和第一页的结束,但是在下一页,它应该是23和22?这毫无意义。。。。就连你在这个问题上的例子也不符合这个逻辑。你能解释一下吗,我不完全理解它的危害。谢谢。如果您的元素编号是在代码中硬编码的,那么每次您想要更改一页上显示的元素数量时,都需要更改它。为什么开始为(2*12-12)=12,停止为(2*12)=24
preparedStatement = connection.prepareStatement("SELECT * FROM videos WHERE category = ? AND subCategory = ? LIMIT ?,?");
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 });
}
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
    }

}