如何从scala中的4个列表中提取元素?

时间:2015-09-30 04:01:10

标签: scala

case class TargetClass(key: Any, value: Number, lowerBound: Double, upperBound: Double)

val keys: List[Any] = List("key1", "key2", "key3")
val values: List[Number] = List(1,2,3);
val lowerBounds: List[Double] = List(0.1, 0.2, 0.3)
val upperBounds: List[Double] = List(0.5, 0.6, 0.7)

现在我想构建一个List[TargetClass]来保存4个列表。有谁知道如何有效地做到这一点?使用for循环逐个添加元素是非常低效的吗?

我尝试使用zipped,但似乎这仅适用于最多组合3个列表。

非常感谢!

5 个答案:

答案 0 :(得分:2)

一种方法:

keys.zipWithIndex.map {
  case (item,i)=> TargetClass(item,values(i),lowerBounds(i),upperBounds(i))
}

您可能需要考虑使用lift方法来处理长度不等的列表(如果密钥长于任何列表,则提供默认值)。

我意识到这并没有解决你的效率问题。你可以很容易地对不同的方法进行一些测试。

答案 1 :(得分:2)

您可以将zipped应用于前两个列表,最后两个列表,然后是前一个拉链的结果,然后映射到您的类,如下所示:

val z12 = (keys, values).zipped
val z34 = (lowerBounds, upperBounds).zipped

val z1234 = (z12.toList, z34.toList).zipped

val targs = z1234.map { case ((k,v),(l,u)) => TargetClass(k,v,l,u) }

// targs = List(TargetClass(key1,1,0.1,0.5), TargetClass(key2,2,0.2,0.6), TargetClass(key3,3,0.3,0.7))

答案 2 :(得分:2)

如果.transpose在列表元组上工作,那就太好了。

for (List(k, v:Number, l:Double, u:Double) <- 
       List(keys, values, lowerBounds, upperBounds).transpose)
  yield TargetClass(k,v,l,u)

答案 3 :(得分:2)

怎么样:

keys zip values zip lowerBounds zip upperBounds map {
  case (((k, v), l), u) => TargetClass(k, v, l, u) 
}

示例:

scala> val zipped = keys zip values zip lowerBounds zip upperBounds
zipped: List[(((Any, Number), Double), Double)] = List((((key1,1),0.1),0.5), (((key2,2),0.2),0.6), (((key3,3),0.3),0.7))

scala> zipped map { case (((k, v), l), u) => TargetClass(k, v, l, u) }
res6: List[TargetClass] = List(TargetClass(key1,1,0.1,0.5), TargetClass(key2,2,0.2,0.6), TargetClass(key3,3,0.3,0.7))

答案 4 :(得分:0)

我认为无论您从效率的角度使用什么,您都必须单独遍历列表。唯一的问题是,你做到了吗?或者为了便于阅读,你使用Scala成语并让Scala做 for 你的脏工作?)

其他方法不一定更有效。您可以根据需要更改压缩的顺序和组装map函数返回值的顺序。

这是功能方式,但我 确定它会更高效。请参阅@wwkudu上的评论(zip with index)answer

 val res1 = keys zip lowerBounds zip values zip upperBounds
 res1.map { 
    x=> (x._1._1._1,x._1._1._2, x._1._2, x._2)
    //Of course, you can return an instance of TargetClass 
    //here instead of the touple I am returning.
 }

我很好奇,为什么你需要一个“TargetClass”?一个人会工作吗?