Scala:如何将数组列表/列表分配给两个变量?

时间:2018-07-22 17:54:16

标签: scala

假设我有以下字符串数组:

return

实际上,这种类型的数组通常是通过读取csv文件获得的。

从概念上讲,我想

  1. 对于每行,用“,”分隔
  2. 拆分所有行后,将第一列分配给一个列表,将第二列分配给另一个列表。

我想出的方法如下:

val lines: List[String] = List("GOOL,1182", "AMZN,1920", "MSFT,124", "APPL,192.2") 

然后,我得到以下列表:

var col1List = List[String]()
var col2List = List[String]()
lines.foreach{ x => 
  val cols = x split ","
  col1List = col1List ::: List(cols(0))
  col2List = col2List ::: List(cols(1))
}

在Scala中有更好的方法吗?

3 个答案:

答案 0 :(得分:6)

您正在寻找的是.unzip方法。

这是一个例子:

val lines: List[String] = List("GOOL,1182", "AMZN,1920", "MSFT,124", "APPL,192.2")
val (l1, l2) = lines.map(_.split(",")).map(arr => (arr.head, arr.last)).unzip
println(l1, l2)

结果:

(List(GOOL, AMZN, MSFT, APPL),List(1182, 1920, 124, 192.2))

答案 1 :(得分:3)

bottaio是正确的,您需要unzip。您需要没有unzip

val lines: List[String] = List("GOOL,1182", "AMZN,1920", "MSFT,124", "APPL,192.2")
val (xs, ys) = lines.unzip{ str => val a = str.split(","); (a(0), a(1)) }
println(xs)
println(ys)

// Output:
// List(GOOL, AMZN, MSFT, APPL)
// List(1182, 1920, 124, 192.2)

请注意,unzip本身接受将列表项转换成对的功能。

答案 2 :(得分:2)

通常,它适用于从.csv文件读入lines的所有大小的行  List

lines.map(_.split(",")).transpose

在Scala REPL中:

    scala> val lines: List[String] = List("GOOL,1182", "AMZN,1920", "MSFT,124", "APPL,192.2")
    lines: List[String] = List(GOOL,1182, AMZN,1920, MSFT,124, APPL,192.2)

    scala> lines.map(_.split(",")).transpose
    res30: List[List[String]] = List(List(GOOL, AMZN, MSFT, APPL), List(1182, 1920, 124, 192.2))

    scala> val lines: List[String] = List("GOOL,1182,23,56", "AMZN,1920,57,21", "MSFT,124,345,987", "APPL,192.2,765,908")
    lines: List[String] = List(GOOL,1182,23,56, AMZN,1920,57,21, MSFT,124,345,987, APPL,192.2,765,908)

    scala> lines.map(_.split(",")).transpose
    res29: List[List[String]] = List(List(GOOL, AMZN, MSFT, APPL), List(1182, 1920, 124, 192.2), List(23, 57, 345, 765), List(56
    , 21, 987, 908))