• Scala学习(九)练习


    文件正则表达式&练习

    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+" ")
    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. }

    运行结果:

    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列仍然保持纵向对齐,并将结果写入同一个文件

    程序代码:

    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(" ", "")+" ")
    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 thismaybe with \" or\{2}"""".r
    7.   val pat2="""like thismaybe 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 thismaybe with " or\"""")
    13.   linesIterator1.foreach(line=>pat1.findAllIn(line).foreach (println))
    14.   println("文本中包含:"+"""like thismaybe 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】。

    本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利

  • 相关阅读:
    模板合集
    1201: 众数问题
    112. 路径总和
    Hibernate的配置及CURD
    5. 最长回文子串
    1120: 最值交换
    1119: 一维数组排序
    1118: 数列有序
    1117: 查找数组元素
    1116: 删除元素
  • 原文地址:https://www.cnblogs.com/sunddenly/p/4444626.html
Copyright © 2020-2023  润新知