对于ruby中的最后一个索引,是否有等效的Array#find_index?

时间:2010-08-24 06:19:09

标签: ruby arrays

Array#find_index允许您查找

的第一项的索引
  • 等于object
  • 将传递给它的块评估为true

Array#rindex可以让你找到最后一项等于object的索引,但是有什么东西可以让你找到最后一项使得一个块传递的索引它回归真实吗?

否则,我应该做点什么

last_index = array.length - 1 - array.reverse.find_index{|item| item.is_wanted?}

5 个答案:

答案 0 :(得分:16)

在Ruby 1.9.2 Array#rindex接受阻止:http://apidock.com/ruby/Array/rindex

答案 1 :(得分:1)

直到1.9.2才出现这样的耻辱。与此同时,如果您不想反转数组,而是反向枚举搜索,则可以执行

last_index = array.length - 1 - array.rindex.find_index{|item| item.is_wanted? }(1.8.7及以上)

答案 2 :(得分:1)

或者你可以做类似

的事情
last_index = array.map {|i| i.is_wanted? }.rindex(true)

这有点漂亮

答案 3 :(得分:0)

你可以通过删除a.length来改善你的变通方法,因为负数指数从[]

中字符串的末尾开始计算
irb(main):015:0> a=[1,2,nil,6,8,nil,9,nil,10,11,12]
=> [1, 2, nil, 6, 8, nil, 9, nil, 10, 11, 12]
irb(main):016:0> -(a.reverse.index(nil)+1)
=> -4
irb(main):017:0> a[-4]
=> nil

当你想要做的只是向后迭代时,反转整个数组似乎仍然效率低得惊人,但这是你的效率与审美判断的对比

答案 4 :(得分:0)

这稍微偏离主题,但只要你有一个大小的集合,并且你想要另一个大小的结果,你可以使用注入。大多数情况下,它避免了对输入集合进行不必要的循环操作。

例如,如果我想找到最后一个nil的索引:

a = [1,2,nil,6,8,nil,9,nil,10,11,12]
# => [1, 2, nil, 6, 8, nil, 9, nil, 10, 11, 12] 
a.inject([-1, nil]){|(current_index, matched), value| current_index += 1; matched = current_index if value.nil?; [current_index, matched]}.last
# => 7