Scala-映射到嵌套列表并在列表的每个级别上排序

时间:2019-07-04 15:07:19

标签: scala sorting dictionary nested

我有一个函数,该函数返回包含子对象列表的对象列表,每个子对象可以有子对象,依此类推,直到未知级别。

我希望能够对列表的每个级别进行排序,直到没有更多要排序的项目为止。我目前有一张地图可以做到这一点,但仅适用于顶级列表项。

def nestedList(params): Future[List[CustomObject]] = {
    getNestedList(params).map {
    items =>
        items.sortBy(i => i.name)
    }
}

这将返回一个Future[List[CustomObject]],其中自定义对象为CustomObject(name, List[CustomObject]))

如何更改它以返回排序后的整个列表?

2 个答案:

答案 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))

应该做这项工作。