Как разбить коллекцию на несколько подмножеств (с внутренним упорядочением) в Scala по предикату? - PullRequest
0 голосов
/ 10 февраля 2020

[Я проверил несколько ответов в Stackoverflow, все из которых рассматривались как разделение на 2 коллекции, здесь я спрашиваю о нескольких коллекциях с редактированием в подмножестве ].

Например, у меня есть 4 объекта:

case class Data(id: Int, name: String)

val data1 = Data(1, "name 1")
val data2 = Data(2, "name 2")
val data3 = Data(7, "name 3") //note same name, different id
val data4 = Data(5, "name 3") //note same name, different id
val data5 = Data(8, "name 3") //note same name, different id

val data = List(data1, data2, data3, data4, data5)

Какой самый "Scala способ" разбить data на, скажем, коллекцию из 3 Tuple уникальное имя с внутренним порядком в каждом подмножестве (например, id здесь)?

Итак, в моем примере это будет:

val res = List((data1),(data2),(data4, data3, data5))?

Ответы [ 2 ]

3 голосов
/ 10 февраля 2020

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

final case class Data(id: Int, name: String)

def groupSorted(data: List[Data]): List[List[Data]] =
  data
    .groupBy(_.name)
    .valuesIterator
    .map(_.sortBy(_.id))
    .toList

Который вы можете использовать так:

val data1 = Data(1, "name 1")
val data2 = Data(2, "name 2")
val data3 = Data(7, "name 3") //note same name, different id
val data4 = Data(5, "name 3") //note same name, different id
val data5 = Data(8, "name 3") //note same name, different id

val data = List(data1, data2, data3, data4, data5)

val result = groupSorted(data)
// result: List[List[Data]] = List(
//   List(Data(2, "name 2")),
//   List(Data(5, "name 3"), Data(7, "name 3"), Data(8, "name 3")),
//   List(Data(1, "name 1"))
// )
1 голос
/ 10 февраля 2020

Если я вас правильно понял, вы хотите сортировать группы и внутри групп.

Вы можете сделать это так:

data.groupBy(d => d.name) // Group by name
  .toSeq.sortBy(g => g._1) // Sort groups by name
  .map(g => g._2.sortBy(d => d.id)) // Sort group item by id

Результатом является вектор списков, а не кортежей, поскольку каждый элемент в списке имеет разную длину, поэтому он не может быть списком кортежей с одинаковой структурой.

Если вы хотите ограничить / расширить каждую группу до 3 элементов, вы можете возвращает список кортежей, т. е. (Данные, Данные, Данные).

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