我在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
}
我有一个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'),]
我需要的是根据提示的代码在这些作品之间建立层次关系。例如A.1是A的第一个童工; B.1.1是B.1工作的第一个孩子,其父母是B工作。我知道Groovy支持递归闭包来构建这种层次结构。如何在Groovy官方文档中使用Groovy递归闭包实现我的目标,例如JN2515 Fibonacci数字示例? 非常感谢!
答案 0 :(得分: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()})
如果我没有出错,即使这个anonim形式可能有效
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()})
答案 1 :(得分:1)
我对Grails有点生疏,但我似乎记得它以智能方式管理映射集合,如果你这样做:work1.parentWork = work2
那么work1 in work2.subWorks
将验证。如果是这种情况,您需要做的只是为每项工作设置parentWork
,并且您不需要为此执行任何复杂的计算:X.Y.Z
的父作品将是{{1并且X.Y
的父作品将是none:
X