从数组中选择两个元素

时间:2015-04-22 21:25:23

标签: ruby

在我的应用程序中,我需要从条件中选择元素和前一个元素。我正在使用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}

还有更优雅的方法吗?

3 个答案:

答案 0 :(得分:1)

您可以使用以下内容:

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)

答案 1 :(得分:0)

不确定each_cons在哪里让事情变得更清晰。为什么不这样做?

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

答案 2 :(得分:0)

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执行其工作并返回值。