Array#find_index
允许您查找
object
或 Array#rindex
可以让你找到最后一项等于object
的索引,但是有什么东西可以让你找到最后一项使得一个块传递的索引它回归真实吗?
否则,我应该做点什么
last_index = array.length - 1 - array.reverse.find_index{|item| item.is_wanted?}
答案 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