2015-03-03 38 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))