分页彩虹算法 - 生成分页列表显示
分页彩虹算法 - 生成分页列表显示
该算法通过传入当前页、总页数、每屏展示的页数,生成一个分页列表显示,类似 [4,5,6,7,8]。
示例:
// 当前页为 5,总页数为 10,每屏展示 5 页
rainbow(5, 10, 5) // [3, 4, 5, 6, 7]
代码实现(Go语言):
package main
import (
"fmt"
"math"
)
/**
* 分页彩虹算法
* 通过传入的信息,生成一个分页列表显示
* [4,5,6,7,8]
* @param currentPage 当前页
* @param pageCount 总页数
* @param displayCount 每屏展示的页数
* @return 分页条
*/
func rainbow(currentPage, pageCount, displayCount int) []int {
isEven := true
isEven = displayCount%2 == 0
left := displayCount / 2
right := displayCount / 2
length := displayCount
if isEven {
right++
}
if pageCount < displayCount {
length = pageCount
}
result := make([]int, length)
if pageCount >= displayCount {
if currentPage <= left {
for i := 0; i < len(result); i++ {
result[i] = i + 1
}
} else if currentPage > pageCount-right {
for i := 0; i < len(result); i++ {
result[i] = i + pageCount - displayCount + 1
}
} else {
for i := 0; i < len(result); i++ {
result[i] = i + currentPage - left + int(math.Ceil(float64(displayCount)/2.0))
}
}
} else {
for i := 0; i < len(result); i++ {
result[i] = i + 1
}
}
ceilResult := make([]int, len(result))
for i := 0; i < len(result); i++ {
ceilResult[i] = int(math.Ceil(float64(result[i])))
}
return ceilResult
}
func main() {
fmt.Println(rainbow(5, 10, 5)) //[3, 4, 5, 6, 7]
}
算法原理:
- 判断奇偶数: 判断
displayCount是否为偶数,因为偶数情况下需要额外处理右边的页码。 - 计算左右页码: 根据
displayCount计算左右两侧需要显示的页码数量。 - 处理边界情况:
- 当总页数小于每屏展示的页数时,直接显示所有页码。
- 当当前页小于
left时,显示从 1 开始的页码。 - 当当前页大于
pageCount - right时,显示从pageCount - displayCount + 1开始的页码。 - 其他情况下,显示从
currentPage - left + (isEven ? 1 : 0)开始的页码。
- 向上取整: 使用
math.Ceil将所有页码向上取整,确保所有页码为整数。
应用场景:
分页彩虹算法可以应用于各种需要展示分页列表的场景,例如博客、论坛、电商平台等。它可以帮助用户快速定位到想要的页面,提高用户体验。
原文地址: https://www.cveoy.top/t/topic/nJpJ 著作权归作者所有。请勿转载和采集!