2012-07-02 44 views
0

我必须搜索数组中的项目并返回下一个项目的值。例如:Ruby:如何找到数组中的下一个匹配

a = ['abc.df','-f','test.h'] 
i = a.find_index{|x| x=~/-f/} 
puts a[i+1] 

除了使用索引之外,还有其他更好的方法吗?

+2

你为什么不喜欢这个? –

+0

您的解决方案没有任何问题。这真的很好想和干净。你为什么要改变它? – YuriAlbuquerque

+0

我正在考虑像'array.find {something} .next'之类的东西,但不知道这些。我不喜欢的是使用索引。 – texasbruce

回答

3

一个经典的功能性方法不使用索引(xs.each_cons(2) - XS的>成对组合):

xs = ['abc.df', '-f', 'test.h'] 
(xs.each_cons(2).detect { |x, y| x =~ /-f/ } || []).last 
#=> "test.h" 

使用Enumerable#map_detect简化它更豆蔻位:

xs.each_cons(2).map_detect { |x, y| y if x =~ /-f/ } 
#=> "test.h" 
1

我不知道一个更清洁的方式来做那个特定的操作。然而,它肯定看起来像你试图解析命令行参数。如果是这样,我建议使用内置的OptionParser模块 - 它会节省大量的时间和头发拉动试图自己解析它们。

This article解释了它是如何工作的。

3

的原因类似的东西array.find{something}.next不存在的是它是一个数组而不是一个链表。每个项目只是它自己的价值;它没有“我之后的项目”的概念。

@tokland通过在每一对连续项目上遍历数组提供了一个很好的解决方案,这样当第一个项目匹配时,您可以方便地使用第二个项目。可以肯定的是,对功能风格有很强的争议。尽管如此,你的版本更短,而且我认为你的浏览速度更快,更容易理解。

如果问题是,你使用它了很多,想要的东西更清洁,更重要的是,那么你当然可以只将其添加为一个单独的方法来a

def a.find_after(&test) 
    self[find_index(&test).next] 
end 

然后

a.find_after{|x| x=~/-f/} 

是找到第一个匹配后的下一个项目的明确方法。

所有这一切都说,我认为@BenjaminCox对看起来是你的实际目标提出了最好的观点。如果你解析命令行选项,那么有很好的库。

+0

太好了!谢谢! – texasbruce

+0

@CarySwoveland谢谢! –

0

与索引一起工作的解决方案很好,正如其他人所评论的。你可以使用Enumerable#drop_while从你的匹配中获得一个数组,并采取第二个元素:

a = ['abc.df','-f','test.h'] 
f_arg = a.drop_while { |e| e !~ /-f/ }[1] 
相关问题