我想根据列表中的几个元素来过滤列表。
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
如何针对上述列表执行此操作?
答案 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 方法内指定选择的转换,以得出所需的结果。