《快学Scala》习题详解 第9章 文件和正则

1 编写一段scala代码,将某个文件的行倒转顺序

  var source = Source.fromFile("C:/my.ini")
  val arr = source.getLines.toArray

  val out = new PrintWriter("c:/my.ini")
  for (i <- (0 until arr.length).reverse) out.println(arr(i))
  out.close()

2 编写一个scala程序,从一个带有制表符的文件读取内容,将每个制表符都替换成空格,使得制表符隔开的n列仍保持对齐

  var source = Source.fromFile("C:/my.ini")
  val arr = source.getLines.toArray
  // 找出第一列中最长的
  val max = arr.map { x => x.split("\t")(0).length() }.max
  var arr2 = for (i <- 0 until arr.length) yield {
    //需要替换的-个数
    val num = max - arr(i).split("\t")(0).length() + 1
    arr(i).replaceAll("\t", "-" * num)
  }
  arr2.foreach { println }

3 编写一小段程序,从文件中读取内容,将字符数>12的单词打印到控制台;如果用单行完成,将有额外奖励

  Source.fromFile("C:/my.ini").getLines().mkString.split(" ").filter { _.length() > 12 } map { println }

4 编写scala程序,从含有浮点数的文件中读取内容,计算浮点数之和,平均值,最大值和最小值

  val words = Source.fromFile("c:/my.ini").getLines().mkString(" ").split(" ")
  val regex = new util.matching.Regex("""^\d+\.\d+$""") //匹配浮点类型
  val arr = words.filter { regex.findFirstMatchIn(_) != None }.map { _.toDouble }
  println("sum:" + arr.sum)
  println("max:" + arr.max)
  println("min:" + arr.min)
  println("average:" + arr.sum / arr.length)

5 编写scala程序,向文件中写入2的n次方及其倒数,指数n从0到20

  val out = new PrintWriter("c:/my.txt")
  for (n <- 1 to 20) {
    val s = n + "\t" + Math.pow(2, n).toInt + "\t" + Math.pow(2, n)
    out.println(s)
  }
  out.close()

6 编写正则表达式,匹配Java或C++中带引号的字符串,并将它打印出来
“like this,maybe with \” or \

  val in = Source.fromFile("c:/string.py").getLines().mkString(" ").split(" ")
  //匹配以// / ' "开头的字符串
  val re = """^((\\\\)|[\"\'\\])\w+""".r
  in.filter { re.findFirstMatchIn(_) != None }.map { println }

7 读取文件,将非浮点数打印出来,用正则表达式实现

  //非浮点不好匹配,然后找出不是浮点类型的
  val re = """^\d+\.\d+$""".r
  in.filter { re.findFirstMatchIn(_) == None }.map { println }

8 编写scala程序,打印某个html页面中的所有img标签的src属性

  val url = "http://www.360doc.com/content/15/0916/10/27494756_499464687.shtml"
  val in = Source.fromURL(url, "UTF-8").mkString("")
  //  `\\s+`匹配任意的空格字符
  //使用非贪婪模式进行匹配
  val gre = "(.*?)(<img\\s+?src.+?>)(.*?)".r
  for (gre(a, b, c) <- gre.findAllIn(in)) { println(b) }

9 编写scala文件,判断给定目录下有多少个以.class结尾的文件

  val dir = new File("D:\\workspace\\mvcTest\\bin\\day12")
  val arr = dir.listFiles()

  for (elem <- arr ) {
    if ("^.+".r.findFirstMatchIn(elem.toString())!=None)
      println(elem)
    }

10 扩展Person类,并将其序列化;用一个集合保存某人的朋友信息,构造一些Person对象,让他们中一些成为朋友,然后将Array[Person]保存到文件,将这个数组从文件中重新读出来,校验朋友关系是否完好

package day
import java.io.FileInputStream
import java.io.FileOutputStream
import java.io.ObjectInputStream
import java.io.ObjectOutputStream
import scala.collection.mutable.ArrayBuffer
class Person(val name: String) extends Serializable {
}
object xx extends App {
  val friends = new ArrayBuffer[Person]
  val p1 = new Person("A")
  val p2 = new Person("B")
  val p3 = new Person("C")
  val p4 = new Person("D")
  friends += (p2, p3, p4)
  val out = new ObjectOutputStream(new FileOutputStream("c:/p.txt"))
  out.writeObject(friends)
  val in = new ObjectInputStream(new FileInputStream("c:/p.txt"))
  val arr = in.readObject().asInstanceOf[ArrayBuffer[Person]]
  arr.foreach { x => println(x.name) }
}

输出:BCD,可知完好

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值