我想转换多个列表,每个列表都有一个常量的内部列表大小,如下所示:
List(List(1, 2, 3), List(3, 4, 5))
List(List(1, 2), List(3, 4))
到此:
List((1, 2, 3), (3, 4, 5))
List((1, 2), (3, 4))
因此,如果val q: List[List[Int]] = List(List(1, 2, 3), List(3, 4, 5)
,可以尝试尝试以下内容:
q.map(_.collect { case a :: b => (a,b) })
对于3元素列表示例,这为您提供了以下形式:
List((1, List(2, 3)), (3, List(4, 5)))
我无法展平元组,因为它们包含两种类型:Int和List [Int],因此我无法根据需要将(1, List(2,3))
转换为(1,2,3)
。
那么,我如何扩展flatten函数来实现这一点,还是有更好的方法在scala中实现这一点? scalaz可以提供帮助吗?
tl; dr :如何将列表的内部列表转换为元组? (可能的一般性问题:如何展平多态元组Ns?)
答案 0 :(得分:1)
你可以使用implicits做类似的事情:
trait TupOps[T,I] {
val size: Int
def fromList(vals: List[I]): T
}
def list2tup[T,I](vals: List[List[I]])(implicit to: TupOps[T,I]) = {
if (!vals.forall(_.size == to.size)) sys.error("wrong list size")
else vals.map(to.fromList _)
}
implicit def tup2ops[I] = new TupOps[(I,I),I] {
val size = 2
def fromList(v: List[I]) = (v(0), v(1))
}
implicit def tup3ops[I] = new TupOps[(I,I,I),I] {
val size = 3
def fromList(v: List[I]) = (v(0), v(1), v(2))
}
像这样调用:
list2tup[(Int,Int),Int](List(List(1,2),List(2,3)))
但这不一定更好,特别是因为你必须第二次写Int
,这是恕我直言,而不是语法限制,因为你不能给出一种类型并告诉编译器推断另一种类型。 / p>
<强>更新强>
如果你明确地传递隐含的内容,它看起来几乎更好:
list2tup(List(List(1,2),List(2,3)))(tup2ops)