我有一个函数,该函数返回包含子对象列表的对象列表,每个子对象可以有子对象,依此类推,直到未知级别。
我希望能够对列表的每个级别进行排序,直到没有更多要排序的项目为止。我目前有一张地图可以做到这一点,但仅适用于顶级列表项。
def nestedList(params): Future[List[CustomObject]] = {
getNestedList(params).map {
items =>
items.sortBy(i => i.name)
}
}
这将返回一个Future[List[CustomObject]]
,其中自定义对象为CustomObject(name, List[CustomObject]))
如何更改它以返回排序后的整个列表?
答案 0 :(得分:2)
让我们假设您的CustomObject
类看起来像:
class CustomObject(val name: String, val children: List[CustomObject])
您说孩子的数量未知。
然后,您可以使用下一个函数对List
中的CustomObject
进行递归排序:
def sortCustomObjects(a: List[CustomObject]): List[CustomObject] = {
a.sortBy(_.name).map(co => new CustomObject(co.name, sortCustomObjects(co.children)))
}
请注意-我使用递归,而不是尾递归-因此您可以在大量输入中获得StackOverflow
。
UPD 1:
您还可以将CustomeObject
定义为case class
并以更实用的方式使用.copy
方法:
case class CustomObject(name: String, children: List[CustomObject])
def sortCustomObjects(a: List[CustomObject]): List[CustomObject] = {
a.sortBy(_.name).map(co => co.copy(children = sortCustomObjects(co.children)))
}
答案 1 :(得分:1)
说我们有
val listsF = Future(List(List(1,3,54,6,3), List(9,7,8,4,3,3)))
然后
listsF.map(_.map(_.sorted))
应该做这项工作。