是否有一个更惯用的" Ruby"写这个的方法?

时间:2015-04-12 16:27:25

标签: ruby arrays

我正在编写一个课程,用于模拟一系列机场代码,以模拟多个城市之间的飞机飞行路径。 例如:给定一个数组[['LAX', 'BWI'], ['BOS', 'SEA'], ['HNL', 'LAX'], ['SEA', 'HNL']],其中每个子数组的第一个索引是 离开机场,第二个是目的地机场,sort_flight_path方法将返回[['BOS', 'SEA'], ['SEA', 'HNL'], ['HNL', 'LAX'], ['LAX', 'BWI']]。 我有一个方法,将起点作为索引值,我有以下方法返回一个新的排序数组。

def sort_flight_path
    flight_path = [] << @list[@start_point]
    start = @start_point
    until flight_path.size == @list.size
      @list.each do |i|
        if @list[start][1] == i[0]
          flight_path << i
          start = @list.index(i)
        end
      end
    end
    flight_path
  end

随着我对Ruby的熟悉程度越来越高,我想找到一个更像&#34; Ruby like&#34;实现这一目标的方法。

2 个答案:

答案 0 :(得分:2)

我认为到目前为止,您可以做的最好的事情是将列表转换为数组,以便查找变得微不足道:

Hash[list] # => {"LAX"=>"BWI", "BOS"=>"SEA", "HNL"=>"LAX", "SEA"=>"HNL"}

工作示例:

list = [['LAX', 'BWI'], ['BOS', 'SEA'], ['HNL', 'LAX'], ['SEA', 'HNL']]
start_point = 1

airport = list[start_point][0]
flight_path = []
h = Hash[list]
h.size.times do
  flight_path << [airport, h[airport]]
  airport = h[airport]
end

答案 1 :(得分:1)

我同意@Karoly认为将列表转换为哈希作为第一步是有意义的。完成后,有许多方法可以构建飞行路径。以下是使用递归的方法:

list = [['LAX', 'BWI'], ['BOS', 'SEA'], ['HNL', 'LAX'], ['SEA', 'HNL']]
h = list.to_h # Use Hash[list] for versions < 2.0
  #=> {"LAX"=>"BWI", "BOS"=>"SEA", "HNL"=>"LAX", "SEA"=>"HNL"} 

def route(start_city, h)
  return start_city if h.empty?
  [start_city, *route(h.delete(start_city), h)]
end

previous question确定了航班开始的城市。在您的示例中,它是&#39; BOS&#39;,因此我们计算:

route('BOS',h)
  #=> ["BOS", "SEA", "HNL", "LAX", "BWI"] 

实际上,我们要问&#34;我们从波士顿去哪里?&#34;得到答案&#34;西雅图&#34;。然后我们遇到了和以前一样的问题,除了我们从西雅图开始,这个名单已经不再是&#34; Bos-&gt; Sea&#34;腿。

相关问题