如何使用scala根据某些元素从字符串列表中查找唯一元素?

时间:2018-11-13 12:43:18

标签: scala list scala-collections

我想根据列表中的几个元素来过滤列表。

 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 :(得分:0)

假设您的列表始终包含三个以上的元素:

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

然后由您决定如何处理小组。例如,如果您只希望列表具有唯一的前三个元素,则:

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

答案 1 :(得分:0)

由于您要根据每个项目的前几个元素对列表进行分组,因此可以执行以下操作:

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 方法内指定选择的转换,以得出所需的结果。