Рекурсивно вставить пару ключ-значение в хеш с равнодушным доступом - PullRequest
0 голосов
/ 21 сентября 2011

Я новичок в ruby ​​на рельсах и пытаюсь сделать что-то вроде: у меня есть хеш

hash1 = {"a"=>"1","b"=>{"c"=>"3","d"=>{"e"=>"5"}},"f"=>"6","g"=>{"h"=>"7","i"=>"8"}}

Затем я использовал рекурсивный метод для чтения пары ключ-значение, как показано ниже:

def traverse_hash_recursively(words)
  words.each_pair do |key,value|
    if value.is_a?(String)
      puts "#{key}=>#{value}"
    else
      traverse_hash_recursively(value)
    end
  end
end

вызвал метод, описанный выше, следующим образом:

traverse_hash_recursively(hash1)

, и результат выглядит так:

a=>1
c=>3
e=>5
f=>6
h=>7
i=>8

Но это не тот вывод, который я искал, яхочу выводить как

hash[a]=1
hash[b][c]=3
hash[b][d][e]=5
hash[f]=6
hash[g][h]=7
hash[g][i]=8

Я знаю, что я написал в коде, даст мне вывод, который я получил, но как я получу желаемый вывод?Кто-нибудь может помочь?

1 Ответ

0 голосов
/ 21 сентября 2011

Нам нужен стек, который будет отслеживать ключи

def traverse_hash_recursively(keys, words)
  words.each_pair do |key,value| 
    keys << key
    if value.is_a?(String)
      puts "#{keys.join(',')}=>#{value}"
      keys.pop
    else
      traverse_hash_recursively(keys, value)
      keys.pop
    end
  end
end

И вам следует вызывать функцию с пустым стеком.

traverse_hash_recursively([], hash1)

Вывод =>

a=>1
b,c=>3
b,d,e=>5
f=>6
g,h=>7
g,i=>8

Теперь все остальное просто форматирование.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...