加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

arrays – Ruby:在数组中查找下一个匹配的索引,或者使用offset

发布时间:2020-12-17 03:18:29 所属栏目:百科 来源:网络整理
导读:我想在Array#find_index {| item |之后找到更多匹配项block}第一次匹配.如何搜索第二场比赛,第三场比赛等的索引? 换句话说,对于Array#find_index,我想要相当于Regexp #matre(str,pos)的pos参数.然后我可以保持当前位置索引继续搜索. 我不能使用Enumerable#f
我想在Array#find_index {| item |之后找到更多匹配项block}第一次匹配.如何搜索第二场比赛,第三场比赛等的索引?

换句话说,对于Array#find_index,我想要相当于Regexp #matre(str,pos)的pos参数.然后我可以保持当前位置索引继续搜索.

我不能使用Enumerable#find_all,因为我可能会在调用之间修改数组(在这种情况下,我还会调整当前位置索引以反映修改).我不想复制部分数组,因为这会增加我的算法的computational complexity.我想这样做而不复制数组:

new_pos = pos + array[pos..-1].find_index do |elem|
    elem.matches_condition?
end

以下是不同的问题.他们只询问数组中的第一个匹配,加上一个:

> https://stackoverflow.com/questions/11300886/ruby-how-to-find-the-next-match-in-an-array
> https://stackoverflow.com/questions/4596517/ruby-find-next-in-array

以下问题更接近,但仍然无法帮助我,因为我需要在继续下一个之前处理第一个匹配(这种方式也与修改冲突):

> https://stackoverflow.com/questions/9925654/ruby-find-in-array-with-offset

解决方法

一种更简单的方法就是:

new_pos = pos
while new_pos < array.size and not array[new_pos].matches_condition?
    new_pos += 1
end
new_pos = nil if new_pos == array.size

事实上,我认为这可能比我的其他答案更好,因为它更难出错,并且没有机会从周围的代码引入未来的阴影问题.但是,它仍然很笨拙.

如果条件更复杂,那么你最终需要做这样的事情:

new_pos = pos
# this check is only necessary if pos may be == array.size
if new_pos < array.size
    prepare_for_condition
end
while new_pos < array.size and not array[new_pos].matches_condition?
    new_pos += 1
    if new_pos < array.size
        prepare_for_condition
    end
end
new_pos = nil if new_pos == array.size

或者,上帝保佑,开始……结束循环(尽管那时你遇到了new_pos的初始值的麻烦):

new_pos = pos - 1
begin
    new_pos += 1
    if new_pos < array.size
        prepare_for_condition
    end
end while new_pos < array.size and not array[new_pos].matches_condition?
new_pos = nil if new_pos == array.size

这可能看起来很糟糕.但是,假设prepare_for_condition是以小方式进行调整的东西.这些调整最终会被重构;然而,到那个时候,重构代码的输出最终也会以不同于旧的重构代码的小方式进行调整,但似乎还没有证明自己的重构是合理的 – 依此类推.偶尔,有人会忘记改变这两个地方.这似乎是病态的;然而,在编程方面,众所周知,病态病例有一种经常发生的习惯.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读