从数组中选择两个元素

问题描述:

在我的应用程序中,我需要从条件和前一个数组中选择元素。我使用each_cons方法,所以我的代码如下所示:从数组中选择两个元素

range_to = 2500 

points = [ 
    {alti: 3000, time: 1}, 
    {alti: 2000, time: 2}, 
    ... 
] 

points.each_cons(2) do |pair| 
    if pair.last[:alti] <= range_to 
    new_point = Interpolation.find_between(pair.first, pair.last, range_to) 
    end 
    break if new_point 
end 

Interpolation.find_between使得在论证两者之间铺设,像插和回报点:

{alti: 2500, time 1.5} 

是否有更多的权利/优雅的方法?

+1

鉴于您正在枚举数组中的每个相邻对,'each_cons'是该作业的正确工具。 –

+3

'@ points','@ range_to','Interpolation','find_between'是什么? – sawa

+0

@sawa,我改进了我的问题。 –

随着Pepegasca answer我来到这个解决方案:

pair = 
    points.each_cons(2).detect do |pair| 
    range_to.between? pair.last[:alti], pair.first[:alti] 
    end 

return nil unless pair 

Interpolation.find_between(pair.first, pair.last, range_to) 

我认为这是简单,清晰,并按照红宝石风格指南。

points.each_cons(2)无给定的回报Enumerator,则detect首先在块状态下给出。然后检查是否成功,如果是 - 功能Interpolation.find_between完成其工作并返回值。

您可以使用类似:

selected_points = points.each_cons(2).select{|p| p.last[:alti] <= range_to}.first 
selected_points && new_point = Interpolation.find_between(selected_points.first, selected_points.last, range_to) 
+0

像你的解决方案,但更好地使用'detect'而不是'select {} .first'。 –

不在这里肯定each_cons让事情更清晰。为什么不这样做?

upper = points.find_index{|point| point[:alti] <= range } 
lower = upper - 1 
new_point = Interpolation.find_between(points[lower], points[upper], range_to) 
+0

它会造成附加条件。例如,如果upper将是第一个元素。 –