2011-12-03 62 views
0

如何使用scala解决此问题演员: 我有一个程序可以找出给定路径下文件中标识符的频率。假定的编码是UTF-8。我想解决与斯卡拉演员相同的问题。如何使用scala参与者

//program to find frequencies of identifiers 
import java.io._ 
import java.util.concurrent._ 
import java.util.concurrent.atomic._ 

object Main { 
    // visit all files in dir 
    def processDirectory(dir: File, visit: (File) => Unit) { 
    for (f <- dir.listFiles) 
     if (f.isDirectory) processDirectory(f, visit) 
     else visit(f) 
    } 

    //counters for all identifiers 
    val frequencies = new scala.collection.mutable.HashMap[String, Int] 

    // Finds all identifiers in a file and increments their counters 
    def process(f: File) { 
    val contents = scala.io.Source.fromFile(f, "UTF-8").mkString 
    val pattern = "[a-zA-Z_][0-9a-zA-Z_]*".r 
    for (m <- pattern.findAllIn(contents)) 
     frequencies(m) = frequencies.getOrElse(m, 0) + 1 
    } 

    def main(args: Array[String]) { //Give path of a directory here 
    processDirectory(new File(args(0)), process _) 

    println("Ten most common identifiers:") 
    val sorted = frequencies.values.toBuffer.sortWith(_ > _) 
    for (i <- 0 until 10)  
     for ((k, v) <- frequencies) 
     if (v == sorted(i)) println(k + " " + v) 
    } 
} 

也请解释斯卡拉演员的概念。我对斯卡拉演员感到困惑。

回答

3

演员帮助并发设计。关于这一点没有什么共同之处。那些想要并行性的人,为了性能,有时候想要正确地做你正在做的事情:采取一些简单的文件系统管理的事情,在它上面添加额外的线程,并且看看它是否更快。但是,这是一个磁盘,随机访问是非常昂贵,所以你没有什么可以从并行处理,演员滥用或其他方式获得。

斯卡拉的演员来自Erlang。所以请看看Erlang的设计师之一Concurrency Oriented Programming in Erlang (pdf)是否帮助你了解他们的想法。他们并不是真的在为了使这些任务加快而投入任务。

一些资源来帮助Scala的演员:

+0

感谢引用。 – riship89