arrays – Ruby:在数组中查找下一个匹配的索引,或者使用offset
我想在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/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是以小方式进行调整的东西.这些调整最终会被重构;然而,到那个时候,重构代码的输出最终也会以不同于旧的重构代码的小方式进行调整,但似乎还没有证明自己的重构是合理的 – 依此类推.偶尔,有人会忘记改变这两个地方.这似乎是病态的;然而,在编程方面,众所周知,病态病例有一种经常发生的习惯. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |