如何使用递归闭包从groovy中的列表构建树层次结构?

Yi.*_*Yi. 5 grails groovy closures

我在grails中定义了递归域类:

class Work {

  String code
  String title
  String description
  static hasMany = [subWorks:Work]
  static mappedBy = [subWorks: 'parentWork']

  Work getRootWork(){
    if(parentWork) return parentWork.getRootWork()
      else return this
  }

  boolean isLeafWork(){
    return subWorks.isEmpty()
  }

  boolean isRootWork(){
    return !parentWork
  }
Run Code Online (Sandbox Code Playgroud)

我有一个Works列表,但层次结构尚未构建.结构如下:

def works = [new Work(code:'A', title:'TitleA'), 
    new Work(code:'B', title:'TitleB'), 
    new Work(code:'A.1', title:'Titile A.1'), 
    new Work(code:'B.1', title:'Title B.1'),
    new Work(code:'B.2', title:'Title B.2'),
    new Work(code:'B.3', title:'Title B.3'), 
    new Work(code:'B.2.2', title:'Title B.2.2'),
    new Work(code:'B.2.3', title:'Title B.2.3'),
    new Work(code:'A.1.1', title:'Title A.1.1'),
    new Work(code:'A.1.2', title:'Title A.1.2'),]
Run Code Online (Sandbox Code Playgroud)

我需要的是根据提示的代码在这些作品之间建立层次关系.例如A.1是A的第一个童工; B.1.1是B.1工作的第一个孩子,其父母是B工作.我知道Groovy支持递归闭包来构建这种层次结构.如何在Groovy官方文档中使用Groovy递归闭包实现我的目标,例如JN2515 Fibonacci数字示例?非常感谢!

Fab*_*oli 3

像这样...?

def root = new Work(code:'*', title:'ROOT')

def build 

build = { p, list ->
  list.groupBy{it.code.split('\\.').first()}.each{ el, sublist ->
    el = sublist[0]        
    el.parentWork = p
    if(sublist.size()>1){
        build(el, sublist[1..-1] )
    }
  }

}
build(root, works.sort{it.code.length()})
Run Code Online (Sandbox Code Playgroud)

如果我没有出错,即使是这种匿名形式也可能有效

def root = new Work(code:'*', title:'ROOT')

{ p, list ->
  list.groupBy{it.code.split('\\.').first()}.each{ el, sublist ->
    el = sublist[0]        
    el.parentWork = p
    if(sublist.size()>1){
      call(el, sublist[1..-1] )
    }
  }

}(root, works.sort{it.code.length()})
Run Code Online (Sandbox Code Playgroud)