gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-04 20:12:07 27 4
gpt4 key购买 nike

我在 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 工作的第一个 child ,其 parent 是 B 工作。我知道 Groovy 支持递归闭包来构建这种层次结构。如何使用 Groovy 递归闭包实现我的目标,例如 Groovy 官方文档中的 JN2515 Fibonacci 数示例?
非常感谢!

最佳答案

像这样...?

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

如果我没有错误,即使在这种匿名形式中也可以工作
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()})

关于grails - 如何使用递归闭包从 groovy 中的列表构建树层次结构?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15967502/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com