小编k r*_*k r的帖子

使用scala.util.Random在Set vs List上进行shuffle的行为

 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)

random scala shuffle list set

11
推荐指数
1
解决办法
1万
查看次数

Scala中的Matrix到CSV

将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)

csv reduce scala map matrix

5
推荐指数
2
解决办法
1015
查看次数

Scala中的范围和内存问题

我有一个非常大的数字列表,经过大量的数学操作.我只关心最终的结果.要模拟此行为,请参阅下面的示例代码:

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,但它没有帮助) …

scala out-of-memory scoping

5
推荐指数
1
解决办法
253
查看次数

相当混淆这个带有&without =的代码片段返回类型

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)
  1. 为什么返回类型不同?
  2. 我真的不关心退货类型.我想调用getX并添加 - 我想做一些像closes1(4).getX这样的事情 - 这是非法的.我怎么做 ?

closures scala equals-operator

4
推荐指数
1
解决办法
8494
查看次数

Scala groupBy:希望数组索引满足谓词,而不是数组值

    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.

我该怎么做?

scala group-by

2
推荐指数
3
解决办法
6422
查看次数