scala> Random.shuffle((1 to 10).toSet)
res10: scala.collection.immutable.Set[Int] = Set(5, 10, 1, 6, 9, 2, 7, 3, 8, 4)
scala> Random.shuffle((1 to 10).toSet)
res11: scala.collection.immutable.Set[Int] = Set(5, 10, 1, 6, 9, 2, 7, 3, 8, 4)
scala> Random.shuffle((1 to 10).toSet)
res12: scala.collection.immutable.Set[Int] = Set(5, 10, 1, 6, 9, 2, 7, 3, 8, 4)
scala> Random.shuffle((1 to 10).toList)
res13: List[Int] = List(3, 9, 8, 5, 7, 6, 10, 2, 1, 4)
scala> Random.shuffle((1 to 10).toList)
res14: List[Int] = List(5, 10, 2, 9, 4, …Run Code Online (Sandbox Code Playgroud) 将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) …Run Code Online (Sandbox Code Playgroud) 我有一个非常大的数字列表,经过大量的数学操作.我只关心最终的结果.要模拟此行为,请参阅下面的示例代码:
object X {
def main(args:Array[String]) = {
val N = 10000000
val x = List(1 to N).flatten
println(x.slice(0,10))
Thread.sleep( 5000)
val y = x.map(_*5)
println(y.slice(0,10))
Thread.sleep( 5000)
val z = y.map( _+4)
println(z.slice(0,10))
Thread.sleep( 5000)
}
}
Run Code Online (Sandbox Code Playgroud)
所以x是一个非常大的列表.我只关心结果z.为了获得z,我首先必须在数学上操纵x来得到y.然后我操纵y得到z.(我不能一步从x到z,因为操作非常复杂.这只是一个例子.)
因此,当我运行这个例子时,我的内存耗尽,大概是因为x,y和z都在范围内,它们都占用了内存.
所以我尝试以下方法:
def main(args:Array[String]) = {
val N = 10000000
val z = {
val y = {
val x = List(1 to N).flatten
println(x.slice(0,10))
Thread.sleep( 5000)
x
}.map(_*5)
println(y.slice(0,10))
Thread.sleep( 5000)
y
}.map( _+4)
println(z.slice(0,10))
Thread.sleep(5000)
}
Run Code Online (Sandbox Code Playgroud)
所以现在只有z在范围内.因此可能会创建x和y,然后在它们超出范围时收集垃圾.但这不是发生的事情.相反,我再次耗尽内存!
(注意:我使用的是java -Xincgc,但它没有帮助) …
object A extends App {
def closure1(x:Int) = {
object O {
def getX = x
def add(y:Int) = x+y
}
val foo = O
foo
}
def closure2(x:Int) {
object O {
def getX = x
def add(y:Int) = x+y
}
val foo = O
foo
}
println(closure1(4).getClass)
println(closure2(4).getClass)
}
result:
$scala A
class A$O$3$
void
Run Code Online (Sandbox Code Playgroud)
val m = Array(10,20,30,30,50,60,70,80) groupBy ( s => s %30 == 0)
m(true).map { kv => println(kv) }
Run Code Online (Sandbox Code Playgroud)
打印值30,30,60
我希望打印索引,即2,3,5.
我该怎么做?