Ruby 如何实施摇树机操作?

Ruby 如何实施摇树机操作?,ruby,recursion,hashmap,recursive-datastructures,Ruby,Recursion,Hashmap,Recursive Datastructures,我需要一个我称之为摇树的操作。我使用递归算法实现了它,只使用了basicruby-Fortran(引用了一句古老的格言“您可以用任何语言编写Fortran代码”),但我怀疑有一种更简洁、更惯用的ruby方法 因为我不知道这个操作的通用名称,让我简单地描述一下。我有一个散列,如以下示例: { "-cutoff:" => { :flag => {:set_ie1 => [:useCutoff, true]}, :arg => {:vector_ie1

我需要一个我称之为摇树的操作。我使用递归算法实现了它,只使用了basicruby-Fortran(引用了一句古老的格言“您可以用任何语言编写Fortran代码”),但我怀疑有一种更简洁、更惯用的ruby方法

因为我不知道这个操作的通用名称,让我简单地描述一下。我有一个散列,如以下示例:

{
  "-cutoff:" =>
  {
    :flag => {:set_ie1 => [:useCutoff, true]},
    :arg => {:vector_ie1 => :double}
  },
  "-depth:" =>
  {
    :flag => {:set_ie2 => [:useInconsistent, true]},
    :arg => :double,
    :default => 2.0
  },
  "-maxclust:" =>
  {
    :flag => {:set_ie3 => [:useCutoff, false]},
    :arg => {:vector_ie2 => :index}
  },
  :fn => "arrayTypeOptions"
}
树的结构中嵌入了独特的符号,如
:vector_ie1
:set_ie3
。我需要删除树的所有分支,而不是从根到带符号的左边的路径。鉴于上述例子:

shake_tree(specs, :vector_ie1)
将返回:

{
  "-cutoff:" =>
  {
    :flag => {:set_ie1 => [:useCutoff, true]},
    :arg => {:vector_ie1 => :double}
  }
}
{
  "-depth:" =>
  {
    :flag => {:set_ie2 => [:useInconsistent, true]},
    :arg => :double,
    :default => 2.0
  }
}

将返回:

{
  "-cutoff:" =>
  {
    :flag => {:set_ie1 => [:useCutoff, true]},
    :arg => {:vector_ie1 => :double}
  }
}
{
  "-depth:" =>
  {
    :flag => {:set_ie2 => [:useInconsistent, true]},
    :arg => :double,
    :default => 2.0
  }
}

一个更有经验的ruby程序员如何完成这项任务?

下面是我的递归实现。我决定将其命名为
shake_-tree
,以使RubyMine的拼写检查器保持愉快(因为我喜欢
shake_-tree specs key
的声音):

这将准确返回上面指定的输出


我仍然很想知道这是否有一个共同的名字。

你为什么不使用像这样的树库呢?它有一个
parentage
方法,可以给你这个。@MarkThomas:谢谢你的链接,但乍一看,这似乎有些过分了。ruby DSL的整个想法是让ruby完成大部分工作……现在,我DSL的“解析器”包括对“源”字符串调用
vMATCodeMonkey\instance\u eval
)我迟到了15秒。。所以我会把我的答案贴在这里。抱歉压缩了。但是,我不能完全确定您的数据是否真的是一棵树。这个例子看起来更像是一组以KEY=>ENTRY形式出现的结构化数据条目,该条目要么是定义良好的结构的简单值。当然,严格地说,它是一棵树,但不仅仅是一棵树:)除非您的“条目”比简单的值或简单的哈希更复杂,否则您可以通过选择或拒绝函数轻松地过滤它,而无需递归。示例(数据=您的输入数据):
data.SELECT{key,entry}[:flag,:arg]。map{k{entry[k]。keys rescue nil}.flatte.include?(:vector_ie2)}
有效地,这几乎是一条直线。请注意,“:标志::ARG”列表在中间。最后,您可能希望更好地调整它们。请原谅这个丑陋的援救零,我想保持想法简短,而不是“全功能”的回复(运算符[])等。但是,如果您要查找的密钥可能恰好比深度=3时更深入,那么肯定需要递归和树节点过滤。顺便说一句。不要误解我的意思:shake_树是一个很好的过滤树的操作,我并不强烈建议你用基于列表/集合的过滤来代替它。只需考虑数据的精确结构,然后选择最匹配的!