使用折叠或贴图转换集合

时间:2015-03-03 11:42:13

标签: scala

此代码将字符串的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")

等N个元素重新编写它

更新:这是可能的解决方案:

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

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

3 个答案:

答案 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))
  1. .split(',')在逗号分隔符处拆分
  2. .drop(1)删除第一个元素
  3. .map(_.toDouble)将字符串转换为浮点数

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

答案 2 :(得分:0)

这在外部列表上有一次迭代:

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