小编典典

用算法/伪代码创建分页链接?

algorithm

有人可以提供代码或伪代码来说明如何生成StackOverflow上的页面链接吗?

我一直在绞尽脑汁,但是想不出一种合适的方法来构建动态链接,该链接始终显示当前页面的2页以及第一页和最后一页。

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


阅读 263

收藏
2020-07-28

共1个答案

小编典典

已经有其他几个答案,但是我想向您展示解决问题的方法:首先,让我们检查一下Stack
Overflow如何处理正常情况和边缘情况。我的每个页面都显示10个结果,因此要找出一页的作用,请找到一个标签,该标签的条目少于11个:可用性在今天有效。我们看不到任何显示,这是有道理的。

两页怎么样?查找包含11到20个条目的标签(emacs现在可以使用)。我们看到:“
1 2下一页”或“上一页1 2 ”,这取决于我们在哪个页面上。

3页?“ 1 2 3 … 3下一个”,“上一页1 2 3下一页”和“上一页1 … 2 3
”。有趣的是,我们可以看到Stack Overflow本身不能很好地处理这种边缘情况:它应该显示“ 1 2 … 3 Next”

4页?“ 1 2 3 … 4下一个”,“上一页1 2 3 … 4下一个”,“上一页1 … 2 3 4下一个”和“上一页1
… 3 4

最后,让我们看一下一般情况,N页:“ 1 2 3 … N Next”,“上一页1 2 3 … N Next”,“上一页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
Next”,您将获得“ 1 2 3 … 10 Next”。为了完全匹配Stack Overflow的情况,您必须检查这种情况:

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

我希望这有帮助!

2020-07-28