1. 程式人生 > >快學Scala習題解答—第九章 檔案和正則表示式

快學Scala習題解答—第九章 檔案和正則表示式

9 檔案和正則表示式

9.1 編寫一小段Scala程式碼,將某個檔案中的行倒轉順序(將最後一行作為第一行,依此類推)

Scala程式碼  收藏程式碼
  1. import io.Source  
  2. import java.io.PrintWriter  
  3. val path = "test.txt"  
  4. val reader = Source.fromFile(path).getLines()  
  5. val result = reader.toArray.reverse  
  6. val pw = new PrintWriter(path)  
  7. result.foreach(line => pw.write(line + "\n"
    ))  
  8. pw.close()  


9.2 編寫Scala程式,從一個帶有製表符的檔案讀取內容,將每個製表符替換成一組空格,使得製表符隔開的n列仍然保持縱向對齊,並將結果寫入同一個檔案
Scala程式碼  收藏程式碼
  1. import io.Source  
  2. import java.io.PrintWriter  
  3. val path = "test.txt"  
  4. val reader = Source.fromFile(path).getLines()  
  5. val result = for ( t <- reader) yield t.replaceAll("\\t","    ")  
  6. val pw = new PrintWriter(path)  
  7. result.foreach(line => pw.write(line + "\n"))  
  8. pw.close()  


9.3 編寫一小段Scala程式碼,從一個檔案讀取內容並把所有字元數大於12的單詞列印到控制檯。如果你能用單行程式碼完成會有額外獎勵
Scala程式碼  收藏程式碼
  1. import io.Source  
  2. Source.fromFile("test.txt").mkString.split("\\s+").foreach(arg => if(arg.length > 12) println(arg))  


9.4 編寫Scala程式,從包含浮點數的文字檔案讀取內容,打印出檔案中所有浮點數之和,平均值,最大值和最小值

Scala程式碼  收藏程式碼
  1. import io.Source  
  2. val nums = Source.fromFile("test.txt").mkString.split("\\s+")  
  3. var total = 0d  
  4. nums.foreach(total += _.toDouble)  
  5. println(total)  
  6. println(total/nums.length)  
  7. println(nums.max)  
  8. println(nums.min)  


9.5 編寫Scala程式,向檔案中寫入2的n次方及其倒數,指數n從0到20。對齊各列: 
  1         1 
  2         0.5 
  4         0.25 
...         ...

Scala程式碼  收藏程式碼
  1. import java.io.PrintWriter  
  2. val pw = new PrintWriter("test.txt")  
  3. for ( n <- 0 to 20){  
  4.   val t = BigDecimal(2).pow(n)  
  5.   pw.write(t.toString())  
  6.   pw.write("\t\t")  
  7.   pw.write((1/t).toString())  
  8.   pw.write("\n")  
  9. }  
  10. pw.close()  


9.6 編寫正則表示式,匹配Java或C++程式程式碼中類似"like this,maybe with \" or\\"這樣的帶引號的字串。編寫Scala程式將某個原始檔中所有類似的字串打印出來
import io.Source 
Scala程式碼  收藏程式碼
  1. val source = Source.fromFile("test.txt").mkString  
  2. val pattern = "\\w+\\s+\"".r  
  3. pattern.findAllIn(source).foreach(println)  


9.7 編寫Scala程式,從文字檔案讀取內容,並打印出所有的非浮點數的詞法單位。要求使用正則表示式
Scala程式碼  收藏程式碼
  1. import io.Source  
  2. val source = Source.fromFile("test.txt").mkString  
  3. val pattern = """[^((\d+\.){0,1}\d+)^\s+]+""".r  
  4. pattern.findAllIn(source).foreach(println)  


9.8 編寫Scala程式打印出某個網頁中所有img標籤的src屬性。使用正則表示式和分組
Scala程式碼  收藏程式碼
  1. import io.Source  
  2. val source = Source.fromFile("D:\\ProgramCodes\\ScalaTest\\src\\test.txt").mkString  
  3. val pattern = """<img[^>]+(src\s*=\s*"[^>^"]+")[^>]*>""".r  
  4. for (pattern(str) <- pattern.findAllIn(source)) println(str)  


9.9 編寫Scala程式,盤點給定目錄及其子目錄中總共有多少以.class為副檔名的檔案
Scala程式碼  收藏程式碼
  1. import java.io.File  
  2. val path = "."  
  3. val dir = new File(path)  
  4. def subdirs(dir:File):Iterator[File]={  
  5.   val children = dir.listFiles().filter(_.getName.endsWith("class"))  
  6.   children.toIterator ++ dir.listFiles().filter(_.isDirectory).toIterator.flatMap(subdirs _)  
  7. }  
  8. val n = subdirs(dir).length  
  9. println(n)  


9.10 擴充套件那個可序列化的Person類,讓它能以一個集合儲存某個人的朋友資訊。構造出一些Person物件,讓他們中的一些人成為朋友,然後將Array[Person]儲存到檔案。將這個陣列從檔案中重新讀出來,校驗朋友關係是否完好 
注意,請在main中執行。指令碼執行無法序列化。

Scala程式碼  收藏程式碼
  1. import collection.mutable.ArrayBuffer  
  2. import java.io.{ObjectInputStream, FileOutputStream, FileInputStream, ObjectOutputStream}  
  3. class Person(var name:String) extends Serializable{  
  4.   val friends = new ArrayBuffer[Person]()  
  5.   def addFriend(friend : Person){  
  6.     friends += friend  
  7.   }  
  8.   override def toString() = {  
  9.     var str = "My name is " + name + " and my friends name is "  
  10.     friends.foreach(str += _.name + ",")  
  11.     str  
  12.   }  
  13. }  
  14. object Test extends App{  
  15.   val p1 = new Person("Ivan")  
  16.   val p2 = new Person("F2")  
  17.   val p3 = new Person("F3")  
  18.   p1.addFriend(p2)  
  19.   p1.addFriend(p3)  
  20.   println(p1)  
  21.   val out = new ObjectOutputStream(new FileOutputStream("test.txt"))  
  22.   out.writeObject(p1)  
  23.   out.close()  
  24.   val in =  new ObjectInputStream(new FileInputStream("test.txt"))  
  25.   val p = in.readObject().asInstanceOf[Person]  
  26.   println(p)  
  27. }