Scala學習(九)練習

文件正則表達式&練習java

1. 編寫一小段Scala代碼,將某個文件中的行倒轉順序,將最後一行做爲第一行,依此類推 正則表達式

程序代碼:數組

  1. import scala.io.Source
  2. import java.io.PrintWriter
  3.  
  4. object ReverseLines extends App {
  5.   val filename="File.txt"
  6.   val RefileName="ReverseFile.txt"
  7.  
  8.   val source=Source.fromFile("src\\"+filename)
  9.   lazy val ReSource=Source.fromFile("src\\"+RefileName)
  10.   lazy val pw = new PrintWriter("src\\"+RefileName)
  11.  
  12.   val linesIterator=source.getLines()
  13.   val linesRecord=linesIterator.toArray
  14.   val reverseRecord=linesRecord.reverse
  15.  
  16.   reverseRecord.foreach {
  17.     line =>pw.write(line+"\n")
  18.   }
  19.   pw.close()
  20.  
  21.   println(filename+" 文件內容以下: ")
  22.   linesRecord.foreach (line=>println(line))
  23.  
  24.   println(RefileName+" 文件內容以下: ")
  25.   ReSource.getLines().foreach(line=>println(line))
  26. }

運行結果:ide

File.txt文件內容以下: 測試

Inc said they plan to form a venture to manage the money market this

borrowing and investment activities of both companies. spa

BP North America is a subsidiary of British Petroleum Co scala

Plc <BP>, which also owns a 55 pct interest in Standard Oil. rest

The venture will be called BP/Standard Financial Trading orm

and will be operated by Standard Oil under the oversight of a

joint management committee.

ReverseFile.txt文件內容以下:

joint management committee.

and will be operated by Standard Oil under the oversight of a

The venture will be called BP/Standard Financial Trading

Plc <BP>, which also owns a 55 pct interest in Standard Oil.

BP North America is a subsidiary of British Petroleum Co

borrowing and investment activities of both companies.

Inc said they plan to form a venture to manage the money market

2. 編寫Scala程序,從一個帶有製表符的文件讀取內容,將每一個製表符替換成一組空格,使得製表符隔開的n列仍然保持縱向對齊,並將結果寫入同一個文件

程序代碼:

  1. object TabSpace extends App{
  2.   val FileName="TabSpace"
  3.   val path="src\\"+FileName+".txt"
  4.   val linesIterator=Source.fromFile(path).getLines()
  5.   lazy val TabIterator=Source.fromFile(path).getLines()
  6.   val linesRecord=linesIterator.toArray
  7.   lazy val pw=new PrintWriter(path)
  8.   println(FileName+" 文件內容以下: ")
  9.   linesRecord.foreach(println)
  10.   linesRecord.foreach {
  11.     line =>pw.write(line.replaceAll("\t", "")+"\n")
  12.   }
  13.   pw.close
  14.   println(" 替換後 "+FileName+" 文件內容以下: ")
  15.   TabIterator.foreach(println)
  16.  
  17. }

運行結果:

TabSpace文件內容以下:

Inc    said    they    plan    to    form    a    venture    to    manage    the    money    market

Inc    ssss    adfs    sdjf    sd    dskl    s    jdakwus    sd    sdskkl    sds    sdsds    djslkl

Inc    said    they    plan    to    form    a    venture    to    manage    the    money    market

Inc    ssss    adfs    sdjf    sd    dskl    s    jdakwus    sd    sdskkl    sds    sdsds    djslkl

Inc    said    they    plan    to    form    a    venture    to    manage    the    money    market        

替換後TabSpace文件內容以下:

Inc said they plan to form a venture to manage the money market

Inc ssss adfs sdjf sd dskl s jdakwus sd sdskkl sds sdsds djslkl

Inc said they plan to form a venture to manage the money market

Inc ssss adfs sdjf sd dskl s jdakwus sd sdskkl sds sdsds djslkl

Inc said they plan to form a venture to manage the money market

3. 編寫一小段Scala代碼,從一個文件讀取內容並把全部字符數大於12的單詞打印到控制檯。若是你能用單行代碼完成會有額外獎勵

程序代碼:

  1. object CheckString extends App{
  2.   val FileName="CheckString"
  3.   val path="src\\"+FileName+".txt"
  4.   println(FileName+" 文件中長度大於12的字符串爲: ")
  5.   io.Source.fromFile(path).mkString.split("\\s+").foreach (str => if(str.length()>12) println(str))
  6. }

運行結果:

CheckString文件中長度大於12的字符串爲:

Incsaidtheyplan

jdakwussdsdskkl

managethemoneymarket

dsklsjdakwussdsdskkl

venturetomanagethe

4. 編寫Scala程序,從包含浮點數的文本文件讀取內容,打印出文件中全部浮點數之和,平均值,最大值和最小值

程序代碼:

  1. object ReadNumber extends App{
  2.   val pattern=" (\\d+[.]\\d+)".r
  3.   val pattern1=" ^\\d+(\\.\\d+)?".r
  4.   val pattern2=" [0-9]+(\\.\\d+)?".r
  5.   val FileName=" NumberFile"
  6.   val path = " src\\"+FileName+" .txt"
  7.   val FileStr=io.Source.fromFile(path).mkString
  8.   val StrArray=pattern2.findAllIn(FileStr).toArray
  9.   var total=0d
  10.   val len=StrArray.length
  11.   StrArray.foreach (total +=_.toDouble)
  12.   println(" 文本中浮點數總和: "+total)
  13.   println(" 文本中浮點數平均數: "+total/len+len)
  14.   println(" 文本中浮點數的最大值: "+StrArray.max)
  15.   println(" 文本中浮點數的最大值: "+StrArray.min)
  16. }

測試數據:

joint    55    666.0    management    13.5    committee    12.5

joint    6.0    123.4    management    3.14    committee    170.5

joint    52    63.32    management    10.4    committee    12.5

運行結果:

文本中浮點數總和: 1188.26

文本中浮點數平均數: 99.0216666666666612

文本中浮點數的最大值: 666.0

文本中浮點數的最大值: 10.4

5. 編寫Scala程序,向文件中寫入2的n次方及其倒數,指數n從0到20。對齊各列:

1 1

2 0.5

4 0.25

... ...

程序代碼:

  1. import java.io.PrintWriter
  2.  
  3. object index extends App{
  4.   val FileName="Index"
  5.   val path="src\\"+FileName+".txt"
  6.   val out=new PrintWriter(path)
  7.   for (i <- 0 to 20)
  8.     out.println(OutIndex(i))
  9.   out.close
  10.   def OutIndex(n:Int)={
  11.     val value=math.pow(2, n)
  12.     ""*4+value.toInt+""*(11-value.toString().size)+math.pow(2, -n)
  13.   }
  14. }

運行結果:

1 1.0

2 0.5

4 0.25

8 0.125

16 0.0625

32 0.03125

64 0.015625

128 0.0078125

256 0.00390625

512 0.001953125

1024 9.765625E-4

2048 4.8828125E-4

4096 2.44140625E-4

8192 1.220703125E-4

16384 6.103515625E-5

32768 3.0517578125E-5

65536 1.52587890625E-5

131072 7.62939453125E-6

262144 3.814697265625E-6

524288 1.9073486328125E-6

1048576 9.5367431640625E-7

6. 編寫正則表達式,匹配Java或C++程序代碼中相似"like this,maybe with \" or\\"這樣的帶引號的字符串。編寫Scala程序將某個源文件中全部相似的字符串打印出來

描述:沒看太懂,按本身意思來的

程序代碼:

  1. import scala.io.Source
  2.  
  3. object regExp extends App{
  4.   val FileName="Regexp"
  5.   val path="src\\"+FileName+".txt"
  6.   val pat1=""""like this maybe with \\" or\\{2}"""".r
  7.   val pat2="""like this maybe with \\" or\\{2}""".r
  8.   val pat3="""\w+\s+\\"""".r
  9.   val linesIterator1=Source.fromFile(path).getLines()
  10.   val linesIterator2=Source.fromFile(path).getLines()
  11.   val linesIterator3=Source.fromFile(path).getLines()
  12.   println(" 文本中包含: "+""""like this maybe with \" or\\"""")
  13.   linesIterator1.foreach(line=>pat1.findAllIn(line).foreach (println))
  14.   println(" 文本中包含: "+"""like this maybe with \" or\\""")
  15.   linesIterator2.foreach(line=>pat2.findAllIn(line).foreach (println))
  16.   println(" 文本中包含: "+"\\w+\\s+\"")
  17.   linesIterator3.foreach(line=>pat3.findAllIn(line).foreach(println))
  18. }

運行結果:

文本中包含:"like thismaybe with \" or\\"

"like thismaybe with \" or\\"

文本中包含:like thismaybe with \" or\\

like thismaybe with \" or\\

like thismaybe with \" or\\

like thismaybe with \" or\\

文本中包含:\w+\s+"

with \"

with \"

with \"

7. 編寫Scala程序,從文本文件讀取內容,並打印出全部的非浮點數的詞法單位。要求使用正則表達式

程序代碼:

  1. import io.Source
  2. object NonFloat extends App{
  3.   val source = Source.fromFile("src\\NumberFile.txt").mkString
  4.   val pat1 = """[^((\d+\.){0,1}\d+)^\s+]+$""".r// 去掉 +試試
  5.   val pat2 = """^((?!^[-]?\d*\.\d+$).)+$""".r
  6.   println(" 模式1不包含整數: ")
  7.   for(token <- source.split("\\s+")){
  8.     for(word <- pat1.findAllIn(token))
  9.       if(!word.equals("")){
  10.         println(token)
  11.       }
  12.   }
  13.   println(" 模式2包含整數: ")
  14.   for(token <- source.split("\\s+")){
  15.     for(word <- pat2.findAllIn(token))
  16.       println(word)
  17.   }
  18. }

測試數據:

joint    55    666.0    management    13.5    committee    12.5

joint    6.0    123.4    management    3.14    committee    170.5

joint    52    63.32    management    10.4    committee    12.5

0.12t    20    5.6ef    45.77ghjss    5.94    dfdxsccxz    7.9

運行結果:

模式1不包含整數:

joint

management

committee

joint

management

committee

joint

management

committee

0.12t

5.6ef

45.77ghjss

dfdxsccxz

模式2包含整數:

joint

55

management

committee

joint

management

committee

joint

52

management

committee

0.12t

20

5.6ef

45.77ghjss

dfdxsccxz

8. 編寫Scala程序打印出某個網頁中全部img標籤的src屬性。使用正則表達式和分組

程序代碼:

  1. object WebSrc extends App{
  2.   val pat = """<img.*?src=[" '](.+?)["'].*?>""".r
  3.    for (pat(src) <-pat.findAllIn(io.Source.fromURL(" http://www.baidu.com").mkString)) {
  4.     println(src)
  5.   }
  6. }

運行結果:

//www.baidu.com/img/bd_logo1.png

//www.baidu.com/img/baidu_jgylogo3.gif

9. 編寫Scala程序,盤點給定目錄及其子目錄中總共有多少以.class爲擴展名的文件

程序代碼:

  1. import java.io.File
  2. object NumDir extends App{
  3.   val path = " ."
  4.   val dir = new File(path)
  5.   def subdirs(dir:File):Iterator[File]={
  6.     val children = dir.listFiles().filter(_.getName.endsWith(" class"))
  7.     children.toIterator ++ dir.listFiles().filter(_.isDirectory).toIterator.flatMap(subdirs _)
  8.   }
  9.   val n = subdirs(dir).length
  10.   println(n)
  11. }

運行結果:

52

10. 擴展那個可序列化的Person類,讓它能以一個集合保存某我的的朋友信息。構造出一些Person對象,讓他們中的一些人成爲朋友,而後將Array[Person]保存到文件。將這個數組從文件中從新讀出來,校驗朋友關係是否無缺 注意,請在main中執行。腳本執行沒法序列化。

程序代碼:

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

運行結果:

My name is JackChen and my friends name is Jhon·D,Sunday,

My name is JackChen and my friends name is Jhon·D,Sunday,

 

若是,您認爲閱讀這篇博客讓您有些收穫,不妨點擊一下右下角的【推薦】。
若是,您但願更容易地發現個人新博客,不妨點擊一下左下角的【關注我】。
若是,您對個人博客所講述的內容有興趣,請繼續關注個人後續博客,我是【Sunddenly】。

 

本文版權歸做者和博客園共有,歡迎轉載,但未經做者贊成必須保留此段聲明,且在文章頁面明顯位置給出原文鏈接,不然保留追究法律責任的權利

相關文章
相關標籤/搜索