此代码将字符串的List集合转换为双打,并删除了csv中的第一个字符串:
val points = List(("A1,2,10"), ("A2,2,5"), ("A3,8,4"), ("A4,5,8"), ("A5,7,5"), ("A6,6,4"), ("A7,1,2"), ("A8,4,9"))
points.map (m => (m.split(",")(1).toDouble , m.split(",")(2).toDouble))
//> res0: List[(Double, Double)] = List((2.0,10.0), (2.0,5.0), (8.0,4.0), (5.0,8.0), (7.0,5.0), (6.0,4.0), (1.0,2.0), (4.0,9.0))
可以使用折叠或贴图重写这些内容,以便CSV列表中元素的长度数字不是硬编码的吗?目前,这只是正确的,其中每个String包含3个CSV元素。但我不确定如何使用("A1,2,10,4,5")
更新:这是可能的解决方案:
points.map (m => (m.split(",").tail).map(m2 => m2.toDouble))
可以使用单遍历而不是两遍来实现吗?
答案 0 :(得分:1)
scala> val points = List(("A1,2,10"), ("A2,2,5,6,7,8,9"))
points: List[String] = List(A1,2,10, A2,2,5,6,7,8,9)
scala> points.map(_.split(",").tail.map(_.toDouble))
res0: List[Array[Double]] = List(Array(2.0, 10.0), Array(2.0, 5.0, 6.0, 7.0, 8.0, 9.0))
修改强>
你提出的很多。至于在没有嵌套.map
的情况下它是否可行,它是非常值得怀疑的:你的.csv表示一个矩阵,通常使用嵌套的for
循环(或.map
)进行操作
答案 1 :(得分:0)
这里的元组不是正确的选择,因为如果事先知道元组中元素的数量,元组通常会更有用。
您可以使用数组,并利用您可以将数组视为集合的事实:
points.map(_.split(',').drop(1).map(_.toDouble))
.split(',')
在逗号分隔符处拆分.drop(1)
删除第一个元素.map(_.toDouble)
将字符串转换为浮点数更新:这相当于您提出的解决方案。
答案 2 :(得分:0)
这在外部列表上有一次迭代:
points.map(_.split(",").tail.map(_.toDouble))