Scala的清单解压缩

时间:2019-04-08 09:29:27

标签: scala functional-programming

所以我的问题很简单。我遇到过很多次,但我的大脑无法找到解决方案。

对于不确定数量的变量,如何将一个列表解压缩到另一个列表中?

这是我的意思。


val list1 = List(List(7, 4), List(7, 6))

val list2 = List(List(1), List(5), List(8))

val desired_list1 = List(List(1, 7, 4), List(5, 7, 4), List(8, 7, 4))

val desired_list2 = List(List(1, 7, 6), List(5, 7, 6), List(8, 7, 6))

//** The desired_list1 and 2 must be a List[List[Int]] it cannot be List[List[Any]] 

//Here's my attempt, which oddly enough completely ignores all elements of list1(0) which are not the first(7).

val attempt = list2.map(i => i +: list1(0)).map(j => j.collect{ case k:Int => k; case l @ a :: b => a}).map(m => m.map{ case i:Any => i.toString.toInt})

//The result is 

attempt: List[List[Int]] = List(List(1, 7), List(5, 7), List(8, 7))

//while it should be:

val desired_list1 = List(List(1, 7, 4), List(5, 7, 4), List(8, 7, 4))

我需要一种非手动的方法来打开包装,请不要告诉我这样做:


val attempt = list2.map(k => k +: list1(0)).map{ case (k, List(x, y)) => (k, x, y)}

基本上,list1可以具有任意数量的元素。例如

val list1 = List(List(99, 83, 2, 3, 4), List(99, 83, 2, 5 7))

但是,这些数字永远不会重复,因此我想它也可能是一个集合。但是我对集合不甚了解,或者它是否有任何帮助。

2 个答案:

答案 0 :(得分:1)

我不确定您为什么要这么做,但是请尝试一下:

val list1 = List(List(7, 4), List(7, 6))
val list2 = List(1, 5, 8)

list2.flatMap(element=> list1.map(innerList=> element:: innerList))

输出:List [List [Int]] = List(List(1,7,4),List(1,7,6),List(5,7,4),List(5,7,6) ,List(8,7,4),List(8,7,6))

答案 1 :(得分:1)

这似乎是您想要的:

val lists: List[List[Int]] = List(List(7, 4), List(7, 6))    
val prefixes: List[List[Int]] = List(List(1), List(5), List(8))

val res: List[List[Int]] = for{
  prefix <- prefixes.flatten
  rest <- lists
} yield prefix :: res

// res: List[List[Int]] = List(List(1, 7, 4), List(1, 7, 6), List(5, 7, 4), List(5, 7, 6), List(8, 7, 4), List(8, 7, 6))

除非您实际上想要一个包含desired_list1desired_list2在一起的列表,在这种情况下,您需要:

val res3 = lists.map{ rest => 
  prefixes.flatten.map{prefix =>
    prefix :: rest
  }
}

/// res3: List[List[List[Int]]] =
// List(
//  List(
//      List(1, 7, 4), List(5, 7, 4), List(8, 7, 4)
//  ), 
//  List(
//      List(1, 7, 6), List(5, 7, 6), List(8, 7, 6)
//  )
// )