gpt4 book ai didi

java - 无法在 Scala 中创建嵌套对象

转载 作者:塔克拉玛干 更新时间:2023-11-01 23:10:05 24 4
gpt4 key购买 nike

我有带有父子引用的对象列表

case class EmployeeLevel(id: Long, name: String, parentId: Long,
item: List[EmployeeLevel])

val employeeList = List(
EmployeeLevel(1L, "Manoj", 0L, Nil),
EmployeeLevel(2L, "Sv", 1L, Nil),
EmployeeLevel(3L, "Cp", 2L, Nil),
EmployeeLevel(4L, "Manju", 3L, Nil))

如何创建树结构或按分层顺序排列它们

val employeeList = List(
EmployeeLevel(1L, "Manoj", 0L, List(
EmployeeLevel(2L, "Sv", 1L, List(
EmployeeLevel(3L, "Cp", 2L, List(
EmployeeLevel(4L, "Manju", 3L, Nil))))))))

或者这是我应该得到的最终 json

[
{
"id": 1,
"name": "Manoj",
"parentId": 0,
"item": [
{
"id": 2,
"name": "Sv",
"parentId": 1,
"item": [
{
"id": 3,
"name": "Cp",
"parentId": 2,
"item": [
{
"id": 4,
"name": "Manju",
"parentId": 3,
"item": [ ]

}
]
}
]
}
]
}
]

我试过这个:

 def arrange(employee1:List[EmployeeLevel],accumulator:List[EmployeeLevel]): List[EmployeeLevel] ={
@tailrec def arrange1(employeeLevel:List[EmployeeLevel],accu:List[EmployeeLevel]):List[EmployeeLevel] ={
if(employeeLevel.nonEmpty){
val headd=employeeLevel.head
val taill=employeeLevel.tail
val tt=taill.filter(_.parentId==headd.id)
val qq= List(headd.copy(item = tt))
arrange1(taill,accu++qq)
}else{
accu
}

}
arrange1(employee1,Nil)
}

但它只适用于一个级别

最佳答案

这应该可以解决问题

object App {
case class EmployeeLevel(id: Long, name: String, parentId: Long,
item: List[EmployeeLevel])

val employeeList = List(
EmployeeLevel(1L, "Manoj", 0L, Nil),
EmployeeLevel(2L, "Sv", 1L, Nil),
EmployeeLevel(3L, "Cp", 2L, Nil),
EmployeeLevel(4L, "Manju", 3L, Nil),
EmployeeLevel(5L, "foobar", 2L, Nil),
EmployeeLevel(6L, "barfoo", 42L, Nil))

def main(args : Array[String]) {
val nestedEmployees = createNestedEmployeesList(employeeList)

println(nestedEmployees)
}

def createNestedEmployeesList(employees: List[EmployeeLevel]): Iterable[EmployeeLevel] = {
val children = employees.groupBy(_.parentId)

val rootNodes = findRootNodes(employees)

rootNodes.flatMap(createChildrenList(_, children))
}

def createChildrenList(id: Long, children: Map[Long, List[EmployeeLevel]]): List[EmployeeLevel] = {
children.get(id) match {
case Some(employees) =>
employees.map(employee => employee.copy(item = createChildrenList(employee.id, children)))
case None => Nil
}
}

def findRootNodes(employees: List[EmployeeLevel]): Set[Long] = {
val parentIds = employees.map(_.parentId).toSet
val nodeIds = employees.map(_.id).toSet

parentIds &~ nodeIds
}
}

算法给出以下输出

List(EmployeeLevel(1,Manoj,0,List(EmployeeLevel(2,Sv,1,List(EmployeeLevel(3,Cp,2,List(EmployeeLevel(4,Manju,3,List()))), EmployeeLevel(5,foobar,2,List()))))))

关于java - 无法在 Scala 中创建嵌套对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32112411/

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