可以someome提供代码或伪的代码如何寻呼链接在计算器都产生的呢?

我绞尽脑汁,但不能认为体面的方式来建立动态的链接,始终显示的2页围绕当前,加上第一个和最后一次。

例如: 1 ... 5 6 7 ... 593

有帮助吗?

解决方案

还有其他几个答案了,但我还想告诉你的方式我了解决它:第一,让我们看看怎么叠的溢出处理正常情况下和边缘案例。每个我的网页显示10的结果,因此,要找出是什么不为1页,找到一个标签,拥有不到11项: 可用性 工作至今。我们可以看到,什么都不显示,其意义的。

如何大约2页?找到一个标签,有11和20项(emacs 今天工作).我们看到:"1 2下"或"上一个1 2"根据这页到我们了

3页?"1 2 3...3的下一步","上一个1 2 3的下一步","上一个1...2 3".有趣的是,我们可以看到,堆叠的溢出本身不处理这种边缘情况非常好:它应该显示器"1 2...3的下一个"

4页?"1 2 3...4Next","上一个1 2 3...4Next","上一个1...2 3 4Next"和"上一个1...3 4"

最后,让我们看看在一般情况下,N页:"1 2 3...N下一步","上一个1 2 3...N下一步","上一个1...2 3 4...N下一步","上一个1...3 4 5...N下",等等。

让我们一概而论的基础上,我们已经看到:算法似乎有这些特征的共同点:

  • 如果我们没在第一页,显示上一个链接到
  • 总是显示第一个页面数量
  • 总是显示目前的页数
  • 总是显示的网页之前,这个页面,该页面之后,这个网页。
  • 总是显示最后的页面数量
  • 如果我们不在最后一页,显示链接到下一个

让我们忽略的边缘情况下的一个单一的网页,并使一个良好的第一次尝试算法:(如已经提到的,该代码实际上打印出来的链接将复杂得多。设想每一个地方,我们把一个页面数量,上一个或下一个呼叫功能将返回正确的网址。)

function printPageLinksFirstTry(num totalPages, num currentPage)
  if ( currentPage > 1 )
    print "Prev"
  print "1"
  print "..."
  print currentPage - 1
  print currentPage
  print currentPage + 1
  print "..."
  print totalPages
  if ( currentPage < totalPages )
    print "Next"
endFunction

这种功能的工作确定,但是它不会考虑我们是否在附近第一个或最后一页。看在上述实例,我们只是想显示...如果目前的页面是两个或更远。

function printPageLinksHandleCloseToEnds(num totalPages, num currentPage)
  if ( currentPage > 1 )
    print "Prev"
  print "1"
  if ( currentPage > 2 )
    print "..."
  if ( currentPage > 2 )
    print currentPage - 1
  print currentPage
  if ( currentPage < totalPages - 1 )
    print currentPage + 1
  if ( currentPage < totalPages - 1 )
    print "..."
  print totalPages
  if ( currentPage < totalPages )
    print "Next"
endFunction

正如你可以看到,我们有一些重复在这里。我们可以继续和干净的,为可读性:

function printPageLinksCleanedUp(num totalPages, num currentPage)
  if ( currentPage > 1 )
    print "Prev"
  print "1"
  if ( currentPage > 2 )
    print "..."
    print currentPage - 1
  print currentPage
  if ( currentPage < totalPages - 1 )
    print currentPage + 1
    print "..."
  print totalPages
  if ( currentPage < totalPages )
    print "Next"
endFunction

只有两个问题的左边。第一,我们不打印出正确的一页,和第二,我们将打印出"1"两次,如果我们在第一或最后一页。让我们干净的这些都在一个去:

function printPageLinksFinal(num totalPages, num currentPage)
  if ( totalPages == 1 )
    return

  if ( currentPage > 1 )
    print "Prev"

  print "1"

  if ( currentPage > 2 )
    print "..."
    print currentPage - 1

  if ( currentPage != 1 and currentPage != totalPages )
    print currentPage

  if ( currentPage < totalPages - 1 )
    print currentPage + 1
    print "..."

  print totalPages

  if ( currentPage < totalPages )
    print "Next"

endFunction

实际上,我撒谎了:我们有一个剩余问题。当你有至少4页,在第一个或最后一页,你会得到一个额外的页面中显示。而不是"1 2...10下一个"你"1 2 3...10下一步"。配什么我们在一起的溢出完全是,你必须要检查这种情况:

function printPageLinksFinalReally(num totalPages, num currentPage)
  if ( totalPages == 1 )
    return

  if ( currentPage > 1 )
    print "Prev"

  print "1"

  if ( currentPage > 2 )
    print "..."
    if ( currentPage == totalPages and totalPages > 3 )
      print currentPage - 2
    print currentPage - 1

  if ( currentPage != 1 and currentPage != totalPages )
    print currentPage

  if ( currentPage < totalPages - 1 )
    print currentPage + 1
    if ( currentPage == 1 and totalPages > 3 )
      print currentPage + 2
    print "..."

  print totalPages

  if ( currentPage < totalPages )
    print "Next"

endFunction

我希望这可以帮助!

其他提示

控制一般显示控制:P1,Pn、Pc(前页),电脑+1时,Pc-1。唯一一次这种变化是在任端寻呼范围{的电脑 < P3或电脑>(Pn-3)}

  • 第一步是明显的工作出的页数:

numPages = ceiling(totalRecords / numPerPage)

  • 如果你已经得到了4个或更少,辍在这一点上,因为,通过上述规则,呼总是固定的(P1和P2,Pn-1,Pn),其中一个将实际上是电脑

  • 还有,你有三个"国家"

a.(电脑 < P3)-所以显示P1,P2,P3,Pn,下一个,如果电脑>1,显示'prev'的链接,前P1。

b.(Pc>Pn-2),以显示上一个,P1,Pn-2,Pn-1,Pn,显示出下一个链接,如果电脑 < Pn

c.显示上一个,P1,Pc-1的电脑、电脑+1,Pn,下一个

易如反掌的伪代码。循环可以获得有点讨厌的实施时作为你已经做了一些重复,以便产生的链接。

编辑:当然前一个和下一个是完全相同的电脑+/-1

好吧,如果你知道的当前一页,这是很微不足道,只是减去的数目由1时,及添加1,然后检查这些数字反对的范围并且显示了第一和最后一页永远,那么如果他们不在序列,加入椭圆。

或者是你问得到的总页数,并确定目前的页码...?

public void PageLinks(int currentPage, int lastPage) {
    if (currentPage > 2) 
        Add('[1]', '...');
    for(int i=Math.Max(1, currentPage-1); i< Math.Min(currentPage+1, lastPage); i++)
        Add('[i]');
    if (currentPage < lastPage-1)
        Add('...', '[lastpage]');
}

lastPage计算的数学。天花板(totalRecords/RecordsPerPage).

嗯。实际上,在这种情况下,当前是3,它仍然表示[1]...[2][3][4]...[xxx] 我觉得省略号是多余的,在这种情况。但是,这是它是如何工作的。

编辑:的预览的格式的具有代码块是否正确,为什么它得到错?肯定的是,它只是伪代码。...但还是....

这是我的方法来做一个寻呼链接。下 java码 只是一个伪。

package com.edde;

/**
 * @author Yang Shuai
 */
public class Pager {

    /**
     * This is a method used to display the paging links(pagination or sometimes called pager).
     * The totalPages are the total page you need to display. You can get this value using the
     * formula:
     * 
     *     total_pages = total_records / items_per_page
     * 
     * This methods is just a pseudo-code.
     * 
     * 
     * @param totalPages how many pages you need to display
     * @param currentPage you are in which page now
     */
    public static void printPageLinks(int totalPages, int currentPage) {

        // how many pages to display before and after the current page
        int x = 2;

        // if we just have one page, show nothing
        if (totalPages == 1) {
            return;
        }

        // if we are not at the first page, show the "Prev" button
        if (currentPage > 1) {
            System.out.print("Prev");
        }

        // always display the first page
        if (currentPage == 1) {
            System.out.print("    [1]");
        } else {
            System.out.print("    1");
        }

        // besides the first and last page, how many pages do we need to display?
        int how_many_times = 2 * x + 1;

        // we use the left and right to restrict the range that we need to display
        int left = Math.max(2, currentPage - 2 * x - 1);
        int right = Math.min(totalPages - 1, currentPage + 2 * x + 1);

        // the upper range restricted by left and right are more loosely than we need,
        // so we further restrict this range we need to display
        while (right - left > 2 * x) {
            if (currentPage - left < right - currentPage) {
                right--;
                right = right < currentPage ? currentPage : right;
            } else {
                left++;
                left = left > currentPage ? currentPage : left;
            }
        }

        // do we need display the left "..."
        if (left >= 3) {
            System.out.print("    ...");
        }

        // now display the middle pages, we display how_many_times pages from page left
        for (int i = 1, out = left; i <= how_many_times; i++, out++) {
            // there are some pages we need not to display
            if (out > right) {
                continue;
            }

            // display the actual page
            if (out == currentPage) {
                System.out.print("    [" + out + "]");
            } else {
                System.out.print("    " + out);
            }
        }

        // do we need the right "..."
        if (totalPages - right >= 2) {
            System.out.print("    ...");
        }

        // always display the last page
        if (currentPage == totalPages) {
            System.out.print("    [" + totalPages + "]");
        } else {
            System.out.print("    " + totalPages);
        }

        // if we are not at the last page, then display the "Next" button
        if (currentPage < totalPages) {
            System.out.print("    Next");
        }
        System.out.println();
    }

    public static void main(String[] args) {
        // printPageLinks(50, 3);
        help(500);
    }

    public static void test(int n) {
        for (int i = 1; i <= n; i++) {
            printPageLinks(n, i);
        }
        System.out.println("------------------------------");
    }

    public static void help(int n) {
        for (int i = 1; i <= n; i++) {
            test(i);
        }
    }

    public static void help(int from, int to) {
        for (int i = from; i <= to; i++) {
            test(i);
        }
    }

}

这里是我的算法,它的作品真的很漂亮:

    // Input
    total_items   // Number of rows, records etc. from db, file or whatever
    per_page      // num items per page
    page          // current page
    visible_pages // number of visible pages

    // Calculations
    lastPage = ceil(total_items / per_page);
    prevPage = page - 1 < 1 ? 0 : page - 1;
    nextPage = page + 1 > lastPage ? 0 : page + 1;
    halfpages = ceil(visible_pages / 2);
    startPage = page - halfpages < 1 ? 1 : page - halfpages;
    endPage = startPage + visible_pages - 1;
    if(endPage > lastPage) {
        startPage -= endPage - lastPage;
        startPage = startPage < 1 ? 1 : startPage;
        endPage = startPage + visible_pages > lastPage ? lastPage : startPage + visible_pages - 1;
    }

    // Output
    lastPage    // Total number of pages
    prevPage    // Previous page number (if 0 there is no prev page)
    nextPage    // Next page number (if 0 there is no next page)
    startPage   // First visible page
    endPage     // Last visible page

所以你可以做一个寻呼机这样的:

    if prevPage
    [1] [prevPage] 
    endif

    [startPage] ... [endPage] 

    if nextPage
    [nextPage] [lastPage] 
    endif

或任何你喜欢的。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top