k r*_*k r 5 csv reduce scala map matrix
将MxN矩阵(M行,N列)写入CSV文件:
我的第一次尝试,使用map,可以工作,但是创建了对stringbuffer的N个引用.它还在每行的末尾写了一个不必要的逗号.
def matrix2csv(matrix:List[List[Double]], filename: String ) = {
val pw = new PrintWriter( filename )
val COMMA = ","
matrix.map( row => {
val sbuf = new StringBuffer
row.map( elt => sbuf.append( elt ).append( COMMA ))
pw.println(sbuf)
})
pw.flush
pw.close
}
Run Code Online (Sandbox Code Playgroud)
我的第二次尝试,使用reduce,也有效,但看起来很笨重:
def matrix2csv(matrix:List[List[Double]], filename: String ) = {
val pw = new PrintWriter( filename )
val COMMA = ","
matrix.map( row => {
val sbuf = new StringBuffer
val last = row.reduce( (a,b)=> {
sbuf.append(a).append(COMMA)
b
})
sbuf.append(last)
pw.println(sbuf)
})
pw.flush
pw.close
}
Run Code Online (Sandbox Code Playgroud)
有关更简洁和惯用方法的任何建议吗?谢谢.
您可以轻松获取字符串表示:
val csvString = matrix.map{ _.mkString(", ") }.mkString("\n")
Run Code Online (Sandbox Code Playgroud)
然后你只需要将其转储到一个文件中.
注意终点线(此处为"\n"),它们根据平台而有所不同.
在惯用语中,您map通过使用它来执行副作用操作而误用.你应该用foreach它代替.
如果您使用a foreach并StringBuffer通过调用mkString方法替换了样板,则可能会出现这种情况:
def matrix2csv(matrix:List[List[Double]], filename: String) {
val pw = new PrintWriter(filename)
val COMMA = ","
matrix.foreach { row => pw.println(row mkString COMMA) }
pw.flush
pw.close
}
Run Code Online (Sandbox Code Playgroud)
注意mkString使用a StringBuilder(非线程安全StringBuffer,这里没问题).
| 归档时间: |
|
| 查看次数: |
1015 次 |
| 最近记录: |