欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

Scala入门笔记二

程序员文章站 2022-04-11 15:29:07
...

上周第一次接触到了Scala并写了几个小作业练习,并记下了Scala入门笔记一,今天继续学习Scala相关知识。

函数组合器和文件读写

package ScalaTest

object ScalaTest2 {
  //函数组合器。运用函数组合器操作会在集合中的每一个元素上应用某一个函数。
  def combinatorTest():Unit = {
    val num = List(1,2,3,4,5)
    //map通过一个函数重新计算列表中所有元素并返回一个相同数目元素的新列表
    val mappedNum = num.map(x => x*x)
    println(mappedNum)
    //foreach和 map类似,但 foreach没有返回值,只是为了对参数进行作用,二者都可遍历集合。
    num.foreach(x =>if(x%2==0) print(x*x+1+" "))//输出原列表中被2整除的数的平方加1后的值。因foreach内部有输出语句,这里就直接调用这个foreach方法就行了。
    //filter移除返回函数值为false的元素,即保留满足条件的元素。
    println()
    val filteredNum = num.filter(x => x%2==0)
    println(filteredNum)
    //flatten。最近背单词恰好背到这个单词,英文原意是 ①vt. 击败,摧毁;使……平坦 ②vi. 变平...// 这里作为一个方法,作用很直观,就是将嵌套的结构展开,多维变成一维。
    val list = List(List("你好","世界"),List("我","是","Scala"))
    println(list.flatten)
    //flatMap。顾名思义,结合了map和flatten的功能,接受一个可以处理嵌套列表的函数,然后把返回结果连接起来。
    val list2 = list.flatMap(x => x.map(x=>x+"啊"))
    println(list2)
    //groupBy。groupBy对集合中元素进行分组操作,结果得到一个包含两个键值对(true & false)的Map。
    println(num.groupBy(x => x%2==0))//对元素进行奇偶分组
  }
  //模式匹配。match对应Java的switch,但要写在选择器表达式后,模式匹配的一般形式为"选择器 match {备选项}"
  //值得注意的是,和C、JAVA等语言不同的是,Scala不需要break语句,每个case都有一个隐含的break存在,只要发现有一个匹配的case就不会匹配剩下的case。
  def matchTest(x:Int) = x match {
    case 1 =>println("one")
    case 2 =>println("two")
    case _ =>println("many")//匹配到的是除12外的其他值
  }
  //选择器不仅可以是变量,还可以是列表。("_"表示占位符,"_*"表示0到任意多个元素)
  def matchTest2(x:List[Int])=x match {
    case List(0,_,_) =>println("列表x有3个元素且第一个元素是0")
    case List(1,_*) =>println("列表x有任意个元素且第一个元素是1")
    case List(_,1,_*) =>println("列表x至少有2个元素且第二个元素是1")
    case List(_*)=> println("其他列表")
  }
  //Scala不提供文件的写入能力,需要带入Java相关类。source类用来读取文件。
  def IOTest(): Unit ={
    import java.io._
    import scala.io.Source
    val pw = new PrintWriter(new File("/text.txt"))//很奇怪,目录下找不到这个文件,却能正常写、读。
    pw.write("You jump I jump.")
    pw.close()
    Source.fromFile("/text.txt").foreach(print)
  }
  def main(args: Array[String]): Unit = {
    combinatorTest()
    matchTest(2)
    val list = List(List(0,1),List(0,-1,2),List(2,4),List(1),List(1,5,2),List(5,2,1),List(0,1,5),List(0,1),List())
    list.foreach(everyList => matchTest2(everyList))//everyList代表常量list中每一个元素(List)
    IOTest()
  }
}


输出结果

Scala入门笔记二

文件读写练习

文件内容:Scala入门笔记二
第二列是号码段,倒数第二列是区号,最后一列是邮政编码。

package ScalaTest
//根据数据文件,编写程序实现用户输入任意省份,输出这个省份号码段的个数,电信、移动、联通各占多少个。
import scala.io.Source
import java.util.Scanner
object ScalaWork3 {

  def main(args: Array[String]): Unit = {
    val sc = new Scanner(System.in)
    val province = sc.nextLine()
    val source = Source.fromFile("F:\\IdeaProjects\\SparkTest\\src\\ScalaTest\\2016phonelocation.txt")
    val lineIterator = source.getLines()
    var ChinaUnicom = 0
    var ChinaMobile = 0
    var ChinaTeleCom = 0
    var num = 0
    for (line <- lineIterator) {
      if(line.contains(province) && line.contains("中国联通")) ChinaUnicom = ChinaUnicom + 1
      if(line.contains(province) && line.contains("中国电信")) ChinaMobile = ChinaMobile + 1
      if(line.contains(province) && line.contains("中国移动")) ChinaTeleCom = ChinaTeleCom + 1
      //三大运行商总数不等于总号码段数,一查居然有虚拟运营商
/*      if(line.contains(province) && !line.contains("中国联通") && !line.contains("中国移动") && !line.contains("中国电信"))
        println(line)*/
      if(line.contains(province)) num = num + 1
    }
    print("该省共有号码段"+(ChinaMobile+ChinaTeleCom+ChinaUnicom)+"个。")
    print("其中,中国电信"+ChinaTeleCom+"个,中国移动"+ChinaMobile+"个,中国联通"+ChinaUnicom+"个。")
    //println(num)
  }
}

输出结果
Scala入门笔记二

相关标签: scala 编程语言