《快学Scala》第九章习题解答

RT。

package com.scalalearn.scala.main

import java.io._

import scala.math._
import scala.collection.mutable.ArrayBuffer
import scala.io.{BufferedSource, Source}

/**
  * 快学scala 09习题
  */
class Person extends Serializable{
  var friends:ArrayBuffer[Person] = new ArrayBuffer[Person]()
  var name:String = ""

  def this(name:String){
    this()
    this.name = name
  }

  def getName():String={
    this.name
  }

  def addFriend(person:Person): Unit ={
    friends += person
  }

  def getFriendList():Unit = {
    for(person <- friends){
      print(person.getName()+" ")
    }
    println
  }
}

object LearnScala09 {
  //1.编写一段scala代码,将某个文件的行逆序
  def execise1(srcFile:String,dstFile:String):Unit = {
    var source:BufferedSource = null
    try{
      source = Source.fromFile(srcFile)
      var lines = source.mkString.split("\r\n").reverse
      var out = new PrintWriter(dstFile)
      for(line<-lines) out.println(line)
      if(out != null) out.close()
    }catch{
      case _:Exception=>println("error")
    }finally{
      if(source != null) source.close()
    }
  }

  //2.编写一个scala程序,从一个带有制表符的文件读取内容,将每个制表符都替换成空格,使得制表符隔开的n列仍保持对齐
  def execise2(srcFile:String):Unit = {
    var source:BufferedSource = null

    try{
      var lines = Source.fromFile(srcFile).mkString
      lines = lines.replaceAll("\t"," "*4)

      var out = new PrintWriter(srcFile)
      out.print(lines)
      out.close()
    }catch{
      case _:Exception=>println("error")
    }finally{
      if(source != null) source.close()
    }
  }

  //3.编写一小段程序,将字符数>12的单词打印到控制台;如果用单行完成,将有额外奖励
  def execise3(srcFile:String):Unit = {
    for(line<-Source.fromFile(srcFile).mkString.replaceAll("\r\n"," ").split(" ") if line.length > 12) println(line)
  }

  //4.编写scala程序,从含有浮点数的文件中读取内容,计算浮点数之和,平均值,最大值和最小值
  def execise4(srcFile:String):Unit = {
    var arr:ArrayBuffer[Float] = new ArrayBuffer[Float]()
    for(line:String<-Source.fromFile(srcFile).mkString.replaceAll("\r\n"," ").split(" ")){
      arr += line.toFloat
    }

    println("total:"+arr.sum)
    println("avg:"+arr.sum/arr.toList.size)
    println("min:"+arr.min)
    println("max:"+arr.max)
  }

  //5.编写scala程序,向文件中写入2的n次方及其倒数,指数n从0到20
  def execise5(dstFile:String):Unit = {
    var out = new PrintWriter(dstFile)
    var line = ""
    for(i <- 0 to 20){
      line += pow(2,i)+"\t"+1/pow(2,i)+"\r\n"
    }
    out.println(line)
    out.flush()
    out.close()
  }

  //6.编写正则表达式,匹配Java或C++中带引号的字符串,并将它打印出来
  def execise6(srcFile:String):Unit = {
    var source:BufferedSource = null

    try{
      var lines = Source.fromFile(srcFile).mkString.split("\r\n")
      val pattern = """["']""".r
      for(line <- lines){
        if(pattern.findFirstIn(line) != None){
          println(line)
        }
      }
    }catch{
      case _:Exception=>println("error")
    }finally{
      if(source != null) source.close()
    }
  }

  //7.读取文件,将非浮点数打印出来,用正则表达式实现
  def execise7(srcFile:String):Unit = {
    var source:BufferedSource = null

    try{
      var lines = Source.fromFile(srcFile).mkString.replaceAll("\r\n"," ").split(" ")
      val pattern = """\d.\d""".r
      for(line <- lines){
        if(pattern.findFirstIn(line) != None){
          println(line)
        }
      }
    }catch{
      case _:Exception=>println("error")
    }finally{
      if(source != null) source.close()
    }
  }

  //8.编写scala程序,打印某个html页面中的所有img标签的src属性
  //用正则分组
  def execise8(url:String):Unit = {
    var source:BufferedSource = null

    try{
      var htmlContent = Source.fromURL(url,"utf-8").mkString
      //println(htmlContent)
      var pattern = """<img.*?>""".r
      val srcpattern = """src=("[^"]+")|('[^']+')""".r
      var arr = pattern.findAllIn(htmlContent).toArray
      for(line <- arr){
        println("url:"+line.toString)
        if(srcpattern.findFirstIn(line) != None){
          println(srcpattern.findFirstIn(line).getOrElse())
        }
      }
    }catch{
      case ex:Exception=>println(ex)
    }finally{
      if(source != null) source.close()
    }
  }

  //9.编写scala文件,判断给定目录下有多少个以.class结尾的文件
  def execise9(dir:File):Unit = {
    var count:Int = 0
    println(dir.listFiles().filter(_.isFile).filter(_.toString.endsWith(".class")).size)
  }

  //10.扩展Person类,并将其序列化;最后再读取
  def execise10():Unit = {
    var person1 = new Person("关羽")
    var person2 = new Person("刘备")
    var person3 = new Person("张飞")
    person2.addFriend(person1)
    person2.addFriend(person3)
    var arrs = Array(person1,person2,person3)

    var out = new ObjectOutputStream(new FileOutputStream("d:/personobj"))
    out.writeObject(arrs)
    out.flush()
    out.close()

    var in = new ObjectInputStream(new FileInputStream("d:/personobj"))
    var readObj:Array[Person] = in.readObject().asInstanceOf[Array[Person]]
    println(readObj(1).getName())
    readObj(1).getFriendList()
  }

  def main(args:Array[String]):Unit = {
    println("====================execise1=====================")
    //LearnScala09.execise1("d:/test1.txt","d:/test2.txt")

    println("====================execise2=====================")
    //LearnScala09.execise2("d:/test3.txt")

    println("====================execise3=====================")
    //LearnScala09.execise3("d:/test4.txt")

    println("====================execise4=====================")
    //LearnScala09.execise4("d:/test5.txt")

    println("====================execise5=====================")
    //LearnScala09.execise5("d:/test6.txt")

    println("====================execise6=====================")
    //LearnScala09.execise6("d:/test6.scala")

    println("====================execise7=====================")
    //LearnScala09.execise7("d:/test7.txt")

    println("====================execise8=====================")
    //LearnScala09.execise8("http://news.sina.com.cn/2016-05-17/doc-ifxsenvm0533979.shtml")

    println("====================execise9=====================")
    //LearnScala09.execise9(new File("d:"))

    println("====================execise10=====================")
    LearnScala09.execise10
  }
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值