2011-12-03 21 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