Scala - отображение во вложенный список и сортировка на каждом уровне списка - PullRequest
0 голосов
/ 04 июля 2019

У меня есть функция, которая возвращает список объектов, содержащий список дочерних объектов, где у каждого дочернего объекта могут быть дочерние объекты и т. Д. До неизвестного уровня.

Я хочу иметь возможность сортировать каждый уровень списка, пока нет больше элементов для сортировки. В настоящее время у меня есть карта, которая делает это, но только для элементов списка верхнего уровня.

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

Возвращает Future[List[CustomObject]], где пользовательский объект CustomObject(name, List[CustomObject]))

Как я могу изменить это, чтобы вернуть весь отсортированный список?

Ответы [ 2 ]

2 голосов
/ 04 июля 2019

Предположим, ваш класс CustomObject выглядит следующим образом:

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

и вы сказали, что уровень детей неизвестен.
Затем вы можете использовать следующую функцию для рекурсивной сортировки List из CustomObject s:

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 голос
/ 04 июля 2019

Скажем, у нас есть

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

, тогда

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

должны выполнить работу.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...