假设我有以下字符串数组:
return
实际上,这种类型的数组通常是通过读取csv文件获得的。
从概念上讲,我想
我想出的方法如下:
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中有更好的方法吗?
答案 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))