有人可以为如何生成StackOverflow上的分页链接提供代码或伪代码吗?
我不停地绞尽脑汁但却想不出一种合适的方式来构建动态链接,这些链接总是显示当前的2页,加上第一页和最后一页.
例: 1 ... 5 6 7 ... 593
Bil*_*ill 45
还有其他几个答案,但我想向您展示我解决它的方法:首先,让我们看看Stack Overflow如何处理正常情况和边缘情况.我的每个页面都显示10个结果,因此要找出它对1个页面的作用,找到一个少于11个条目的标记:可用性今天起作用.我们可以看到没有显示任何内容,这是有道理的.
2页怎么样?查找包含11到20个条目的标记(emacs今天有效).我们看到:" 1 2 Next"或"Prev 1 2 ",具体取决于我们所在的页面.
3页?" 1 2 3 ... 3 Next","Prev 1 2 3 Next"和"Prev 1 ... 2 3 ".有趣的是,我们可以看到Stack Overflow本身并不能很好地处理这种边缘情况:它应该显示" 1 2 ... 3 Next"
4页?" 1 2 3 ... 4 Next","Prev 1 2 3 ... 4 Next","Prev 1 ... 2 3 4 Next"和"Prev 1 ... 3 4 "
最后让我们看一般情况,N页:" 1 2 3 ... N Next","Prev 1 2 3 ... N Next","Prev 1 ... 2 3 4 ... N Next", "Prev 1 ... 3 4 5 ... N Next"等
让我们根据我们所看到的内容进行概括:算法似乎有这些共同特征:
让我们忽略单个页面的边缘情况并首先尝试算法:(如前所述,实际打印链接的代码会更复杂.想象一下我们放置页码的每个地方,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
Run Code Online (Sandbox Code Playgroud)
此功能正常,但它没有考虑我们是否接近第一页或最后一页.看看上面的例子,我们只想显示...如果当前页面是两个或更多.
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
Run Code Online (Sandbox Code Playgroud)
如您所见,我们在这里有一些重复.我们可以继续清理它以获得可读性:
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
Run Code Online (Sandbox Code Playgroud)
只剩下两个问题了.首先,我们不能正确打印一页,其次,如果我们在第一页或最后一页,我们将打印两次"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
Run Code Online (Sandbox Code Playgroud)
实际上,我撒了谎:我们还有一个问题.如果您有至少4页并位于第一页或最后一页,则显示屏中会显示额外的页面.而不是" 1 2 ... 10下一个"你得到" 1 2 3 ... 10下一个".为了完全匹配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
Run Code Online (Sandbox Code Playgroud)
我希望这有帮助!