Как найти уникальные элементы из списка списка строк на основе некоторых элементов, используя scala? - PullRequest
0 голосов
/ 13 ноября 2018

Я хочу отфильтровать список по нескольким элементам в нем.

 pritnln("databind = "datamap)

 dataBind = List((List(3,60,90,T3,T6),List(3,90,89,T32,T5),List(3,60,90,T5,T6), List(3,120,89,T32,T5))

Я хочу отфильтровать этот список [list [string]] на основе уникальных первых элементов, присутствующих в каждом списке. Если первые три элемента повторяются, я не хочу его получать.

Мой ожидаемый результат

List((List(3,60,90,T3,T6),List(3,90,89,T32,T5),List(3,120,89,T32,T5))

Когда я проверил некоторые вопросы, они использовали для списка кортежей

databind.groupBy(v => (v._1, v._2, v._3)).keys.ToList

Как я могу сделать это для вышеупомянутого списка?

Ответы [ 2 ]

0 голосов
/ 01 февраля 2019

Поскольку вы хотите сгруппировать списки на основе первых нескольких элементов каждого элемента, вы можете выполнить следующие действия:

scala> val dataBind = List(List(3,60,90,"T3","T6"),List(3,90,89,"T32","T5"),List(3,60,90,"T5","T6"), List(3,120,89,"T32","T5"))
dataBind: List[List[Any]] = List(List(3, 60, 90, T3, T6), List(3, 90, 89, T32, T5), List(3, 60, 90, T5, T6), List(3, 120, 89, T32, T5))
scala> dataBind.groupBy(_.take(3)).mapValues(_.head).values.toList
res8: List[List[Any]] = List(List(3, 120, 89, T32, T5), List(3, 60, 90, T3, T6), List(3, 90, 89, T32, T5))

Вы можете указать преобразование по своему выбору внутри mapValues ​​ метод для получения желаемого результата.

0 голосов
/ 13 ноября 2018

Предполагая, что ваши списки всегда содержат более 3 элементов:

scala> val l = List(List(1,2,3,4), List(2,3,4,5), List(1,2,3,5))
l: List[List[Int]] = List(List(1, 2, 3, 4), List(2, 3, 4, 5), List(1, 2, 3, 5))

scala> l.groupBy(_.take(3))
res1: scala.collection.immutable.Map[List[Int],List[List[Int]]] = Map(List(1, 2, 3) -> List(List(1, 2, 3, 4), List(1, 2, 3, 5)), List(2, 3, 4) -> List(List(2, 3, 4, 5)))

Тогда вам решать, что вы делаете с группами. Например, если вам нужны только списки с уникальными первыми 3 элементами, то:

scala> res1.collect{ case (_, List(l)) => l}
res2: scala.collection.immutable.Iterable[List[Int]] = List(List(2, 3, 4, 5))
...