速くScalaの練習問題の解答を学びます—第9章のファイルと正規表現

10573 ワード

10 ファイルと正規表現
10.1 Scalaコードのセグメントを作成し、ファイル内のローを反転させます(最後のローを最初のローとして、このようにします).
import io.Source
import java.io.PrintWriter

val path = "test.txt"

val reader = Source.fromFile(path).getLines()

val result = reader.toArray.reverse

val pw = new PrintWriter(path)

result.foreach(line => pw.write(line + "
"
)) pw.close()

10.2 Scalaプログラムを作成し、タブ付きのファイルから内容を読み出し、各タブをスペースのセットに置き換え、タブで区切られたn列が縦方向に整列したまま、結果を同じファイルに書き込む
import io.Source
import java.io.PrintWriter

val path = "test.txt"

val reader = Source.fromFile(path).getLines()

val result = for ( t <- reader) yield t.replaceAll("\\t","    ")

val pw = new PrintWriter(path)

result.foreach(line => pw.write(line + "
"
)) pw.close()

10.3 小さなScalaコードを作成し、1つのファイルからコンテンツを読み取り、12より大きい文字数の単語をコンソールに印刷します.単行コードで完成すれば追加のご褒美があります
import io.Source

Source.fromFile("test.txt").mkString.split("\\s+").foreach(arg => if(arg.length > 12) println(arg))

10.4 Scalaプログラムを作成し、浮動小数点数を含むテキストファイルから内容を読み出し、ファイル内のすべての浮動小数点数の和、平均値、最大値、最小値を印刷します.
import io.Source

val nums = Source.fromFile("test.txt").mkString.split("\\s+")

var total = 0d

nums.foreach(total += _.toDouble)

println(total)
println(total/nums.length)
println(nums.max)
println(nums.min)

10.5 Scalaプログラムを作成し,2のn次方程式とその逆数をファイルに書き込み,指数nは0から20である.列の整列:
  1         1
  2         0.5
  4         0.25
...         ...
import java.io.PrintWriter

val pw = new PrintWriter("test.txt")

for ( n <- 0 to 20){
  val t = BigDecimal(2).pow(n)
  pw.write(t.toString())
  pw.write("\t\t")
  pw.write((1/t).toString())
  pw.write("
"
) } pw.close()

10.6 JavaまたはC++プログラムコードの「like this,maybe with」or」のような引用符付き文字列に一致する正規表現を作成します.Scalaプログラムを作成して、あるソースファイルの類似文字列をすべて印刷します.
import io.Source

val source = Source.fromFile("test.txt").mkString

val pattern = "\\w+\\s+\"".r

pattern.findAllIn(source).foreach(println)

10.7 Scalaプログラムを作成し、テキストファイルから内容を読み取り、すべての浮動小数点数以外の語法単位を印刷します.正規表現を使用する必要があります.
import io.Source

val source = Source.fromFile("test.txt").mkString

val pattern = """[^((\d+\.){0,1}\d+)^\s+]+""".r

pattern.findAllIn(source).foreach(println)

10.8 Scalaプログラムを作成して、あるページのすべてのimgラベルのsrc属性を印刷します.正規表現とグループ化を使用します.
import io.Source

val source = Source.fromFile("D:\\ProgramCodes\\ScalaTest\\src\\test.txt").mkString
val pattern = """<img[^>]+(src\s*=\s*"[^>^"]+")[^>]*>""".r

for (pattern(str) <- pattern.findAllIn(source)) println(str)


10.9 Scalaプログラムを作成し、指定されたディレクトリとそのサブディレクトリの合計.classを拡張子とするファイルがどれだけあるかを確認します.
import java.io.File

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)

10.10 シーケンス可能なPersonクラスを拡張し、ある人の友人情報を1つのセットで保存できるようにします.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 Test extends App{
  val p1 = new Person("Ivan")
  val p2 = new Person("F2")
  val p3 = new Person("F3")

  p1.addFriend(p2)
  p1.addFriend(p3)
  println(p1)

  val out = new ObjectOutputStream(new FileOutputStream("test.txt"))
  out.writeObject(p1)
  out.close()

  val in =  new ObjectInputStream(new FileInputStream("test.txt"))
  val p = in.readObject().asInstanceOf[Person]
  println(p)
}
Blog URL:http://www.ivanpig.com/blog/?p=478