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个列表。
非常感谢!
答案 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”?一个人会工作吗?