我有一个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的新手。
事实上,在解释了问题之后,我有点迷失在这个问题中,但我假设您想将列表中每个R
的List[(List[A], List[R])]
转换为List[(List[A], R)]
。一个很好也很简单的方法是用于理解:
val result: List[(List[A], R)] = for {
(as, rs) <- firstList
r <- rs
} yield (as, r)
您也可以使用等效的方法,但使用flatMap
、map
:
val result: List[(List[A], R)] = firstList.flatMap { case (as, rs) =>
rs.map {r =>
(as, r)
}
}