我使用Geokit来计算两个位置对象之间的距离。http://geokit.rubyforge.org/
我的问题是,如果我有一个位置阵列,那么通过它们来计算总行程的最佳算法是什么?起初,我认为Enumerable#inject是一种方法,它传递N-1个位置对象之间的距离备忘录,但随后就无法存储您已经在实际数组中检查的位置对象的状态。
这需要有数组的大小,我们当前所在的索引,以及注入的行为。理想情况下,你可以做一些类似的事情:
locations = [Geokit::LatLng, Geokit::LatLng, ...]
locations.inject(0) do |memo, location|
memo += location.distance_from(previous_location)
end
不过,在这种情况下,previous_location是未定义的。
想法?
下面是一个非常简单的示例,说明您想要实现的目标。我使用正则数和绝对值作为距离度量,只是为了使迭代更清晰。
arr = [1, 2, 3, 4]
arr.each_cons(2).collect {|a| (a[1]-a[0]).abs }.reduce(:+)
=> 3
- Each_cons(2)取每2个连续元素,在这种情况下,生成[1,2]、[2,3]和[3,4]
- Collect是将每对映射到距离度量的映射操作
- Reduce只是将它们相加