gpt4 book ai didi

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

转载 作者:塔克拉玛干 更新时间:2023-11-03 02:20:19 27 4
gpt4 key购买 nike

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

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

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

最佳答案

已经有其他几个答案,但我想向您展示我用来解决它的方法:首先,让我们看看 Stack Overflow 如何处理正常情况和边缘情况。我的每个页面都显示 10 个结果,因此要了解它对 1 个页面的作用,请找到一个条目少于 11 个的标签:usability今天工作。我们可以看到没有任何显示,这是有道理的。

2 页如何?查找包含 11 到 20 个条目的标签(emacs 今天有效)。我们看到:“1 2 Next”或“Prev 1 2”,具体取决于我们所在的页面。

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

4 页? "1 2 3 ... 4 下一个", "上一个 1 2 3 ... 4 下一个", "上一个 1 ... 2 34 下一个”和“上一个 1 ... 3 4

最后我们来看一般情况,N页:"1 2 3 ... N Next", "Prev 1 2 3 ... N Next", "上一个 1 ... 2 3 4 ... N 下一个", "上一个 1 ... 3 4 5 ... N 下一个", 等.

让我们根据我们所看到的进行概括: 该算法似乎具有以下共同特征:

  • 如果我们不在第一页,显示指向上一页的链接
  • 始终显示首页
  • 始终显示当前页码
  • 始终显示此页之前的页面和此页之后的页面。
  • 始终显示最后页码
  • 如果我们不在最后一页,显示指向下一页的链接

让我们忽略单个页面的边缘情况,并对该算法进行良好的首次尝试:(如前所述,实际打印出链接的代码会更复杂。想象一下我们在每个地方放置一个页码, Prev 或 Next 作为将返回正确 URL 的函数调用。)

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

希望对您有所帮助!

关于创建分页链接的算法/伪代码?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44542/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com