【问题标题】:Is there an equivalent of Array#find_index for the last index in ruby?ruby 中的最后一个索引是否有等效的 Array#find_index ?
【发布时间】:2010-08-24 06:19:08
【问题描述】:

Array#find_index 允许您找到第一个项目的索引

  • 等于object,或
  • 使传递给它的块评估为真

Array#rindex 可以让您找到等于object 的最后一项的索引,但是有什么可以让您找到使传递给它的块返回 true 的最后一项的索引?

否则,我应该做类似的事情

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

【问题讨论】:

    标签: ruby arrays


    【解决方案1】:

    在 Ruby 1.9.2 中,Array#rindex 接受块:http://apidock.com/ruby/Array/rindex

    【讨论】:

      【解决方案2】:

      或者你可以做类似的事情

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

      有点漂亮

      【讨论】:

        【解决方案3】:

        直到 1.9.2 才出现这样的遗憾。同时,如果你不想反转你的数组,而是反向枚举搜索,你可以这样做

        last_index = array.length - 1 - array.rindex.find_index{|item| item.is_wanted? }(1.8.7 及更高版本)

        【讨论】:

          【解决方案4】:

          您可以通过删除 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
          

          当您想要做的只是向后迭代整个数组时,反转整个数组似乎仍然非常低效,但这是您的效率与美学判断调用

          【讨论】:

          • 无论是谁否决了这个答案,你的反对意见究竟是什么?
          【解决方案5】:

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

          例如,如果我想找到最后一个 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
          

          【讨论】:

            【解决方案6】:

            第一个和最后一个索引号可以通过以下方式识别:

            对于整数数组:

            irb(main):003:0> month = [31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31]
            => [31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31]
            irb(main):004:0> puts month.first
            31
            => nil
            irb(main):005:0> puts month.last
            31
            => nil
            irb(main):006:0> puts month.index(month.first)
            0
            => nil
            irb(main):007:0> puts month.rindex(month.last)
            11
            => nil
            irb(main):008:0>
            

            对于字符串数组:

            irb(main):013:0> weekDays = Array[ "Mon", "Tues", "Wed", "Thu", "Fri", "Sat", "Sun" ]
            => ["Mon", "Tues", "Wed", "Thu", "Fri", "Sat", "Sun"]
            irb(main):014:0> puts weekDays.first
            Mon
            => nil
            irb(main):015:0> puts weekDays.last
            Sun
            => nil
            irb(main):016:0> puts weekDays.index(weekDays.first)
            0
            => nil
            irb(main):017:0> puts weekDays.rindex(weekDays.last)
            6
            => nil
            irb(main):018:0>
            

            array.index(element) 如果数组中没有重复/复制元素,也可以识别最后一个索引号。但我认为最好使用 array.rindex(element) 找出最后一个索引号。最初创建 array.rindex(element) 是为了标识数组中给定的相似元素的最后一个索引号。欲了解更多信息:https://rubyapi.org/2.7/o/array#method-i-rindex

            【讨论】:

              猜你喜欢
              • 2011-08-31
              • 1970-01-01
              • 2011-10-31
              • 1970-01-01
              • 2013-04-01
              • 1970-01-01
              • 2021-08-25
              • 1970-01-01
              • 2016-01-21
              相关资源
              最近更新 更多