【问题标题】:Recursive DFS Ruby method递归 DFS Ruby 方法
【发布时间】:2010-12-06 16:53:37
【问题描述】:

我有一个 YAML file of groups,我想进入一个名为 groups 的 MongoDB 集合,其中包含 {"name" => "golf", "parent" => "sports"} 之类的文档(顶级组,如体育,在没有 parent 的情况下将只是 {"name" => "sports"}。)

我们正在尝试traverse the nested hash,但我不确定它是否正常工作。我更喜欢使用递归方法而不是 lambda proc。我们应该改变什么才能让它发挥作用?

谢谢!

马特

【问题讨论】:

    标签: ruby recursion yaml traversal depth-first-search


    【解决方案1】:

    这是工作代码:

    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
    

    查看Interests YAML
    查看acani source

    【讨论】:

      【解决方案2】:

      您的问题只是如何转换此代码:

      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]})
      }
      

      ...使用方法而不是 lambda?如果是,那么:

      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
      

      如果这不是您要问的,请帮助澄清。

      【讨论】:

      • 谢谢,但是 lambda 不起作用,所以仅仅将其转换为方法并不能解决核心问题。我的问题是如何让它工作(最好用代替 lambda 的方法)。见my answer
      猜你喜欢
      • 1970-01-01
      • 2020-02-10
      • 2015-02-27
      • 2015-01-17
      • 2014-06-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多