【问题标题】:Scala - Mapping into a nested list and sorting on each level of listScala - 映射到嵌套列表并在列表的每一级排序
【发布时间】:2019-11-15 08:32:33
【问题描述】:

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

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

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

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

如何更改此设置以返回已排序的整个列表?

【问题讨论】:

  • 你有Future[List[List[CustomObject]]]吗?你能提供实际的类型吗?
  • 这会返回一个Future[List[CustomObject]],其中自定义对象是CustomObject(name, List[CustomObject]))

标签: scala sorting dictionary nested


【解决方案1】:

假设您的 CustomObject 类如下所示:

class CustomObject(val name: String, val children: List[CustomObject])

你说有未知级别的孩子。
然后你可以使用下一个函数对CustomObjects 中的List 进行递归排序:

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

【讨论】:

    【解决方案2】:

    说我们有

    val listsF = Future(List(List(1,3,54,6,3), List(9,7,8,4,3,3)))
    

    然后

    listsF.map(_.map(_.sorted))
    

    应该做的工作。

    【讨论】:

    • 所以我收到一条错误消息cannot resolve symbol sorted。我的根列表是一个对象列表,每个对象都有自己的包含子对象的列表。会不会有问题?
    • 抱歉,我的问题解释得很糟糕。一个对象列表,可以包含嵌套到未知层数的子对象列表。
    猜你喜欢
    • 1970-01-01
    • 2021-08-09
    • 1970-01-01
    • 1970-01-01
    • 2016-02-12
    • 2017-05-25
    • 1970-01-01
    • 2019-01-19
    • 1970-01-01
    相关资源
    最近更新 更多