Scala練習(九)
檔案正則表示式&練習 |
1. 編寫一小段Scala程式碼,將某個檔案中的行倒轉順序,將最後一行作為第一行,依此類推
程式程式碼:
- import scala.io.Source
- import java.io.PrintWriter
- object ReverseLines extends App {
- val filename="File.txt"
- val RefileName="ReverseFile.txt"
- val source=Source.fromFile("src\\"+filename)
-
lazy val ReSource=Source.fromFile("src\\
- lazy val pw = new PrintWriter("src\\"+RefileName)
- val linesIterator=source.getLines()
- val linesRecord=linesIterator.toArray
- val reverseRecord=linesRecord.reverse
- reverseRecord.foreach {
- line =>pw.write(line+"\n")
- }
- pw.close()
-
println(filename+"
- linesRecord.foreach (line=>println(line))
- println(RefileName+"檔案內容如下:")
- ReSource.getLines().foreach(line=>println(line))
- }
執行結果:
File.txt檔案內容如下:
Inc said they plan to form a venture to manage the money market
borrowing and investment activities of both companies.
BP North America is a subsidiary of British Petroleum Co
Plc <BP>, which also owns a 55 pct interest in Standard Oil.
The venture will be called BP/Standard Financial Trading
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列仍然保持縱向對齊,並將結果寫入同一個檔案
程式程式碼:
- object TabSpace extends App{
- val FileName="TabSpace"
- val path="src\\"+FileName+".txt"
- val linesIterator=Source.fromFile(path).getLines()
- lazy val TabIterator=Source.fromFile(path).getLines()
- val linesRecord=linesIterator.toArray
- lazy val pw=new PrintWriter(path)
- println(FileName+"檔案內容如下:")
- linesRecord.foreach(println)
- linesRecord.foreach {
- line =>pw.write(line.replaceAll("\t", "")+"\n")
- }
- pw.close
- println("替換後"+FileName+"檔案內容如下:")
- TabIterator.foreach(println)
- }
執行結果:
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的單詞列印到控制檯。如果你能用單行程式碼完成會有額外獎勵
程式程式碼:
- object CheckString extends App{
- val FileName="CheckString"
- val path="src\\"+FileName+".txt"
- println(FileName+"檔案中長度大於12的字串為:")
- io.Source.fromFile(path).mkString.split("\\s+").foreach (str => if(str.length()>12) println(str))
- }
執行結果:
CheckString檔案中長度大於12的字串為:
Incsaidtheyplan
jdakwussdsdskkl
managethemoneymarket
dsklsjdakwussdsdskkl
venturetomanagethe
4. 編寫Scala程式,從包含浮點數的文字檔案讀取內容,打印出檔案中所有浮點數之和,平均值,最大值和最小值
程式程式碼:
- object ReadNumber extends App{
- val pattern="(\\d+[.]\\d+)".r
- val pattern1="^\\d+(\\.\\d+)?".r
- val pattern2="[0-9]+(\\.\\d+)?".r
- val FileName="NumberFile"
- val path = "src\\"+FileName+".txt"
- val FileStr=io.Source.fromFile(path).mkString
- val StrArray=pattern2.findAllIn(FileStr).toArray
- var total=0d
- val len=StrArray.length
- StrArray.foreach (total +=_.toDouble)
- println("文字中浮點數總和: "+total)
- println("文字中浮點數平均數: "+total/len+len)
- println("文字中浮點數的最大值: "+StrArray.max)
- println("文字中浮點數的最大值: "+StrArray.min)
- }
測試資料:
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
... ...
程式程式碼:
- import java.io.PrintWriter
- object index extends App{
- val FileName="Index"
- val path="src\\"+FileName+".txt"
- val out=new PrintWriter(path)
- for (i <- 0 to 20)
- out.println(OutIndex(i))
- out.close
- def OutIndex(n:Int)={
- val value=math.pow(2, n)
- ""*4+value.toInt+""*(11-value.toString().size)+math.pow(2, -n)
- }
- }
執行結果:
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程式將某個原始檔中所有類似的字串打印出來
描述:沒看太懂,按自己意思來的
程式程式碼:
- import scala.io.Source
- object regExp extends App{
- val FileName="Regexp"
- val path="src\\"+FileName+".txt"
- val pat1=""""like this,maybe with \\" or\\{2}"""".r
- val pat2="""like this,maybe with \\" or\\{2}""".r
- val pat3="""\w+\s+\\"""".r
- val linesIterator1=Source.fromFile(path).getLines()
- val linesIterator2=Source.fromFile(path).getLines()
- val linesIterator3=Source.fromFile(path).getLines()
- println("文字中包含:"+""""like this,maybe with \" or\\"""")
- linesIterator1.foreach(line=>pat1.findAllIn(line).foreach (println))
- println("文字中包含:"+"""like this,maybe with \" or\\""")
- linesIterator2.foreach(line=>pat2.findAllIn(line).foreach (println))
- println("文字中包含:"+"\\w+\\s+\"")
- linesIterator3.foreach(line=>pat3.findAllIn(line).foreach(println))
- }
執行結果:
文字中包含:"like this,maybe with \" or\\"
"like this,maybe with \" or\\"
文字中包含:like this,maybe with \" or\\
like this,maybe with \" or\\
like this,maybe with \" or\\
like this,maybe with \" or\\
文字中包含:\w+\s+"
with \"
with \"
with \"
7. 編寫Scala程式,從文字檔案讀取內容,並打印出所有的非浮點數的詞法單位。要求使用正則表示式
程式程式碼:
- import io.Source
- object NonFloat extends App{
- val source = Source.fromFile("src\\NumberFile.txt").mkString
- val pat1 = """[^((\d+\.){0,1}\d+)^\s+]+$""".r//去掉+試試
- val pat2 = """^((?!^[-]?\d*\.\d+$).)+$""".r
- println("模式1不包含整數:")
- for(token <- source.split("\\s+")){
- for(word <- pat1.findAllIn(token))
- if(!word.equals("")){
- println(token)
- }
- }
- println("模式2包含整數:")
- for(token <- source.split("\\s+")){
- for(word <- pat2.findAllIn(token))
- println(word)
- }
- }
測試資料:
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屬性。使用正則表示式和分組
程式程式碼:
- object WebSrc extends App{
- val pat = """<img.*?src=["'](.+?)["'].*?>""".r
- for (pat(src) <-pat.findAllIn(io.Source.fromURL("http://www.baidu.com").mkString)) {
- println(src)
- }
- }
執行結果:
//www.baidu.com/img/bd_logo1.png
//www.baidu.com/img/baidu_jgylogo3.gif
9. 編寫Scala程式,盤點給定目錄及其子目錄中總共有多少以.class為副檔名的檔案
程式程式碼:
- import java.io.File
- object NumDir extends App{
- val path = "."
- val dir = new File(path)
- def subdirs(dir:File):Iterator[File]={
- val children = dir.listFiles().filter(_.getName.endsWith("class"))
- children.toIterator ++ dir.listFiles().filter(_.isDirectory).toIterator.flatMap(subdirs _)
- }
- val n = subdirs(dir).length
- println(n)
- }
執行結果:
52
10. 擴充套件那個可序列化的Person類,讓它能以一個集合儲存某個人的朋友資訊。構造出一些Person物件,讓他們中的一些人成為朋友,然後將Array[Person]儲存到檔案。將這個陣列從檔案中重新讀出來,校驗朋友關係是否完好 注意,請在main中執行。指令碼執行無法序列化。
程式程式碼:
- import collection.mutable.ArrayBuffer
- import java.io.{ObjectInputStream, FileOutputStream, FileInputStream, ObjectOutputStream}
- class Person(var name:String) extends Serializable{
- val friends = new ArrayBuffer[Person]()
- def addFriend(friend : Person){
- friends += friend
- }
- override def toString() = {
- var str = "My name is " + name + " and my friends name is "
- friends.foreach(str += _.name + ",")
- str
- }
- }
- object PersonTest extends App{
- val p1 = new Person("JackChen")
- val p2 = new Person("Jhon·D")
- val p3 = new Person("Sunday")
- p1.addFriend(p2)
- p1.addFriend(p3)
- println(p1)
- val out = new ObjectOutputStream(new FileOutputStream("src\\Person.txt"))
- out.writeObject(p1)
- out.close()
- val in = new ObjectInputStream(new FileInputStream("src\\Person.txt"))
- val p = in.readObject().asInstanceOf[Person]
- println(p)
- }
執行結果:
My name is JackChen and my friends name is Jhon·D,Sunday
My name is JackChen and my friends name is Jhon·D,Sunday
本文轉自http://www.cnblogs.com/sunddenly/p/4444626.html