算法 数据分页算法优化,求教大神

xufuhaobeijing · 2015年07月25日 · 最后由 love93hate 回复于 2018年08月27日 · 7139 次阅读

开始接触 ruby 不久,算是绝对的 ruby 新人,所以当写出的代码很长时,总感觉是 ruby 的话应该还有更精简的写法,但是限于我的知识,苦思冥想也没有找到一个更合适的解决方法,问题如下,请各位 ruby 高手不吝指点:

现在的项目中遇到这样一个情景,需要把整理出来的数据进行分页,然后返回给客户端,客户端第一次请求不带参数,默认返回最前边的 n 个元素,然后客户端可以通过把第一次请求的首尾元素以及想要前页还是后页放入 params 来请求该组元素的前后页数据,下面是我写的一个分页逻辑,但是感觉太长,不知是否有可以改进的地方?

参数详解--------------------------------------------------------------------

arr: 要被分页的数据数组 start_element: 上次返回的开始元素 end_element: 上次返回的结束元素 action: 这一次索要的数据是前页还是后页,可以是 prev,或者 next pace: 每一页的数量

代码如下----------------------------------------------------------------------

def paginate (arr, start_element=nil, end_element=nil, action=nil, pace)
    if start_element and end_element and action
      start_index = arr.index(start_element)
      end_index = arr.index(end_element)

      case action 
      when 'next'
        prev_start_index = (start_index - pace + 1 > 0) ? (start_index - pace + 1) : 0
        prev_end_index = (start_index - 1) > 0 ? (start_index -1) : 0
        result = arr[prev_start_index..prev_end_index]
        next_start_element = result.first
        next_end_element = result.last
      when 'prev'
        next_start_index = (end_index + 1 < arr.count) ? end_index + 1 : arr.count - 1
        next_end_index = (end_index + pace < arr.count) ? end_index + pace : arr.count - 1
        result = arr[next_start_index..next_end_index]
        next_start_element = result.first
        next_end_element = result.last
      end

      if next_start_element == next_end_element and (next_end_element == start_element || next_start_element == end_element)
        result = []
      end

      [next_start_element,next_end_element,result]
    else 
      result = arr.first(pace)
      [result.first, result.last, result]
    end
  end

找个实现了分页的 gem 不就行了, will_paginate,或者 kaminari。这东西完全没必要自己写,如果非要坚持自己造轮子,至少也先看下别人是怎么实现的吧?

#1 楼 @martin91 原来还有专门分页的 gem,这就去看看,谢谢啦!😄

#2 楼 @xufuhaobeijing 是的,在 Ruby 中,基本所有常见的业务场景都有对应的 gem 实现,比如 验证用户的 devise,授权的 cancancan,编写 API 的 grape 等等,根本不需要自己一上来就自己写。新手推荐先从直接利用 gem 实现业务需求开始,等有一定基础之后,就推荐你删繁就简,在项目中多自己摸索或者造轮子了,这样才能成长。最后,欢迎进入 Ruby 的欢乐世界!

#3 楼 @martin91 哈哈,ruby 真的很好玩,可能有新鲜感作祟的嫌疑,但是相比其他程序,ruby 确实更像是在与计算机交谈。谢谢你认真回了这么多😄

will_paginate +1

机器学习交易——如何使用回归预测股票价格?最近翻译了一篇文章,本人对机器学习应用在量化投资上很感兴趣,希望可以和社区大神一起交流学习。

需要 登录 后方可回复, 如果你还没有账号请 注册新账号