2015-03-03 39 views
0

此代码字符串列表集合转换成双打与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列表中元素的数量不是硬编码的?目前这只是正确的,每个字符串包含3个CSV元素。但我不能确定使用N个元素,如("A1,2,10,4,5")

更新如何重新写:这是可能的解决方案:

points.map (m => (m.split(",").tail).map(m2 => m2.toDouble)) 

可以使用单遍历,而不是两个可以实现吗?

回答

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)进行操作。

0

元组不是正确的选择,因为如果事先知道元组中元素的数目,元组通常更有用。

您可以使用,虽然阵列和采取的事实,你可以把数组作为集合优势:

points.map(_.split(',').drop(1).map(_.toDouble)) 
  1. .split(',')分裂的逗号分隔符
  2. .drop(1)删除第一个元素
  3. .map(_.toDouble)将字符串转换为浮点数

更新:这相当于您提出的解决方案。

0

这有在外部列表中的一个迭代:

points.map(_.split(",").tail.map(_.toDouble))