我正在编写一个课程,用于模拟一系列机场代码,以模拟多个城市之间的飞机飞行路径。
例如:给定一个数组[['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;实现这一目标的方法。
答案 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;腿。