Рекурсивный метод DFS Ruby - PullRequest
       31

Рекурсивный метод DFS Ruby

0 голосов
/ 06 декабря 2010

У меня есть YAML-файл групп , который я хотел бы добавить в коллекцию MongoDB, называемую группами с документами, такими как {"name" => "golf", "parent" => "sports"} (группы верхнего уровня, такие как спортивные, будут просто {"name" => "sports"} безparent.)

Мы пытаемся пройти через вложенный хэш , но я не уверен, работает ли он правильно.Я бы предпочел использовать рекурсивный метод, чем лямбда-процесс.Что мы должны изменить, чтобы это работало?

Спасибо!

Мэтт

Ответы [ 2 ]

2 голосов
/ 24 декабря 2010

Вот рабочий код:

require 'mongo'
require 'yaml'

conn = Mongo::Connection.new
db = conn.db("acani")
interests = db.collection("interests")
@@interest_id = 0
interests_hash = YAML::load_file('interests.yml')

def interests.insert_interest(interest, parent=nil)
  interest_id = @@interest_id.to_s(36)
  if interest.is_a? String # base case
    insert({:_id => interest_id, :n => interest, :p => parent})
    @@interest_id += 1
  else # it's a hash
    interest = interest.first # get key-value pair in hash
    interest_name = interest[0]
    insert({:_id => interest_id, :n => interest_name, :p => parent})
    @@interest_id += 1
    interest[1].each do |i|
      insert_interest(i, interest_name)
    end
  end
end

interests.insert_interest interests_hash

Просмотр Интересов YAML .
Просмотр источника acani .

0 голосов
/ 06 декабря 2010

Ваш вопрос заключается в том, как преобразовать этот код:

insert_enumerable = lambda {|obj, collection|
   # obj = {:value => obj} if !obj.kind_of? Enumerable
   if(obj.kind_of? Array or obj.kind_of? Hash)
      obj.each do |k, v|
        v = (v.nil?) ? k : v
        insert_enumerable.call({:value => v, :parent => obj}, collection)
      end
   else
      obj = {:value => obj}
   end
   # collection.insert({name => obj[:value], :parent => obj[:parent]})
   pp({name => obj[:value], :parent => obj[:parent]})
}

... использовать метод, а не лямбду? Если так, то:

def insert_enumerable( obj, collection )
   # obj = {:value => obj} if !obj.kind_of? Enumerable
   if(obj.kind_of? Array or obj.kind_of? Hash)
      obj.each do |k, v|
        v = (v.nil?) ? k : v
        insert_enumerable({:value => v, :parent => obj}, collection)
      end
   else
      obj = {:value => obj}
   end
   # collection.insert({name => obj[:value], :parent => obj[:parent]})
   pp({name => obj[:value], :parent => obj[:parent]})
end

Если это не то, что вы спрашиваете, пожалуйста, помогите уточнить.

...