Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/scala/17.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Scala中的CSV矩阵_Scala_Csv_Map_Matrix_Reduce - Fatal编程技术网

Scala中的CSV矩阵

Scala中的CSV矩阵,scala,csv,map,matrix,reduce,Scala,Csv,Map,Matrix,Reduce,将MxN矩阵(M行,N列)写入CSV文件: 我的第一次尝试是使用map,可以工作,但是创建了N个对stringbuffer的引用。它还会在每行末尾写入一个不必要的逗号 def matrix2csv(matrix:List[List[Double]], filename: String ) = { val pw = new PrintWriter( filename ) val COMMA = "," matrix.map( row => { val sbuf = ne

将MxN矩阵(M行,N列)写入CSV文件:

我的第一次尝试是使用map,可以工作,但是创建了N个对stringbuffer的引用。它还会在每行末尾写入一个不必要的逗号

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
}
我的第二次尝试是使用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
}

有没有关于更简洁、更惯用的方法的建议?谢谢。

您可以轻松获得字符串表示:

val csvString = matrix.map{ _.mkString(", ") }.mkString("\n")
然后你只需要将它转储到一个文件中


请注意端点(此处为“\n”),它们根据平台的不同而不同。

惯用的说法是,您误用了
map
,使用它来执行副作用操作。对此,您应该使用
foreach

如果使用
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
}

请注意,
mkString
使用
StringBuilder
(非线程安全的
StringBuffer
,在这里很好)。

如何进行第二次编译尝试?在
sbuf.append(b)
中,范围中没有
b
。谢谢,这非常简洁和惯用。