我有一个列表[(列表[A],列表[R])] - 分别包含两个对象A和R列表的元组列表。如何为每个列表[A]"flatten"列表[R]?



我有一个List[(List[a],List[R])]-一个分别由两个对象a和R组成的元组的列表

例如,List[([A1, A2], [R1, R2, R3])]

我想做的是将它转换为每个R对象的List[(List[A], R)]。因此,基本上,制作一个List[Tuple2],其中R对象被"展平"为a对象的列表。

示例-对于上述示例,整个列表应分为3个子列表,如下所示:u2028u2028

List[([A1, A2], R1)]
List[([A1, A2], R2)]
List[([A1, A2], R3)]

我需要得到给定任何A元素列表的每个R元素。原因是A元素可以包含嵌套的子A元素和多个R元素,所以我需要将每个R分离为List[A]的一部分。

到目前为止,这是我尝试过的,但我不知道如何做";"压平";我问题的一部分:u2028

lazy val rules: List[(List[A], R)] = {
//listOfA = List[A1, A2, A3,…]
//listOfR = List[R1, R2, R3, …]
val fromA = listOfA.map { A => (List(A.description) ++ A.subGroups.map(_.description), A.rules) } // Currently: List[(List[A], List[R])]  Required: List[(List[A], R)]
val fromR = listOfR.map { r => (Nil, r) } // List[(Nil, R)]
fromA ++ fromR
}

这是A案例类的定义:

case class A(description: Descriptor, rules: List[R], subGroups: List[A])

…并且case类R直接包含List[R]。在fromR定义的情况下,不存在列表[A],因此用Nil代替它来表示空白列表[A]。

正如你所看到的,对于val fromR,我可以通过映射它来获得单个R,就像我在R中所做的那样。我需要从fromA ++ fromR获得一个组合结果(因为我的输入可能包含a和直接R中的R的混合)。u2028

我的问题是fromA的定义。到目前为止,我只能得到每个List[A]的List[R]。如何为每个List[A]分离每个R…问题主要在于A.rules的定义。

请帮忙,因为我是Scala的新手。

事实上,在解释了问题之后,我有点迷失在这个问题中,但我假设您想将列表中每个RList[(List[A], List[R])]转换为List[(List[A], R)]。一个很好也很简单的方法是用于理解:

val result: List[(List[A], R)] = for {
(as, rs) <- firstList
r <- rs
} yield (as, r)

您也可以使用等效的方法,但使用flatMapmap:

val result: List[(List[A], R)] = firstList.flatMap { case (as, rs) => 
rs.map {r => 
(as, r)
}
}

最新更新