簡體   English   中英

有沒有更慣用的“ Ruby”方式來編寫此代碼?

[英]Is there a more idiomatic “Ruby” way to write this?

我正在編寫一個類,該類將以一種模擬多個城市之間的飛機飛行路線的方式對一系列機場代碼進行排序。 例如:給定數組[['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越來越熟悉,我想找到一種更像“ Ruby類似”的方式來完成此任務。

我認為到目前為止,您可以做的最好的事情就是將列表轉換為數組,這樣查找就變得很簡單了:

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

我同意@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

上一個問題中已經確定了航班開始飛行的城市。 在您的示例中,它是“ BOS”,因此我們計算:

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

實際上,我們問“我們從波士頓去哪里?” 並得到答案“西雅圖”。 然后,我們將有與以前相同的問題,只是我們從西雅圖開始,並且列表不再包含“ Bos-> Sea”分支。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM