Как перебрать вложенный массив / хэш и получить данные оттуда - PullRequest
0 голосов
/ 17 апреля 2019

Я столкнулся с проблемой - решить задачу, где у меня есть файл .yml, например:

time:
  -
    begin: :washington
    end: :briston
    min: 6
    price: 3
  -
    begin: :briston
    end: :dallas
    min: 4
    price: 2
  -
    begin: :dallas
    end: :tokyo
    min: 3.5
    price: 3
  -
    begin: :tokyo
    end: :chicago
    min: 3.5
    price: 3

и класс Train, где я хочу просмотреть этот файл .yml, извлечь необходимую информацию и работать с этими значениями (начальная станция, конечная станция, цена и продолжительность).

class Train 
  require 'yaml'

  def initialize(time, line)
    @time = YAML.load_file(time)
    @line = YAML.load_file(line)
  end

  def calc(begin, end)
    @time.select do |key, value|
      puts key, value
    end
  end
end

В методе «calc» я определил метод «select» для извлечения ключей и значений, но он просто печатал весь хеш следующим образом:

time
{"begin"=>:washington, "end"=>:briston, "min"=>6, "price"=>3}
{"begin"=>:briston, "end"=>:dallas, "min"=>4, "price"=>2}
{"begin"=>:dallas, "end"=>:tokyo, "min"=>3.5, "price"=>3}

Как я могу перебрать этот хеш, чтобы получить необходимые данные? Заранее спасибо!

1 Ответ

1 голос
/ 17 апреля 2019

Если я получу точку, см. Мой комментарий, учитывая переменную @time:

@time = {"time"=>[{"begin"=>:washington, "end"=>:briston, "min"=>6, "price"=>3}, {"begin"=>:briston, "end"=>:dallas, "min"=>4, "price"=>2}, {"begin"=>:dallas, "end"=>:tokyo, "min"=>3.5, "price"=>3}, {"begin"=>:tokyo, "end"=>:chicago, "min"=>3.5, "price"=>3}]}

Один путь к цепочке, для рефакторинга:

ary = @time['time']
start = :washington
stop = :tokyo
res = []
loop do
  tmp = ary.find { |h| h['begin'] == start }
  break unless tmp
  res << tmp
  start = tmp['end']
  break if start == stop
end

Тогда у вас естьres:

#=> [{"begin"=>:washington, "end"=>:briston, "min"=>6, "price"=>3}, {"begin"=>:briston, "end"=>:dallas, "min"=>4, "price"=>2}, {"begin"=>:dallas, "end"=>:tokyo, "min"=>3.5, "price"=>3}]

Например, получить сумму min:

res.sum { |h| h['min'] } #=> 13.5
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...