Scala基础学习03

Posted Weikun Xing

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Scala基础学习03相关的知识,希望对你有一定的参考价值。

文章目录

scala类

一般,Scala类名的第一个字母要大写,几个单词拼成一个类名,每个单词首字母大写。Scala中的类不声明为public,一个Scala类中可以有多个源文件,并且Scala类可以有参数。

定义一个类Point来计算二维坐标移动后的坐标

scala> :paste
// Entering paste mode (ctrl-D to finish)

class Point(xc:Int,yc:Int)
    var x:Int=xc
    var y:Int=yc
def move(dx:Int,dy:Int)
    x=x+dx
    y=y+dy
    println("x: "+x)
    println("y: "+y)
    

// Exiting paste mode, now interpreting.

defined class Point

scala> new Point(1,2).move(2,3)
x: 3
y: 5

Scala继承一个类需要使用关键字extends

scala> :paste
// Entering paste mode (ctrl-D to finish)

class Location(val xc:Int,val yc:Int,val zc:Int) extends Point(xc,yc)
    var z:Int=zc
def move(dx:Int,dy:Int,dz:Int)
    x=x+dx
    y=y+dy
    z=z+dz
println("x:"+x);
println("y:"+y);
println("z:"+z);
    


// Exiting paste mode, now interpreting.

defined class Location

scala> new Location(1,2,3).move(1,1,1)
x:2
y:3
z:4

Scala只允许继承一个父类,并且继承父类的所有属性和方法。子类继承父类中已实现的方法需要使用关键字override,子类继承父类中未实现的方法可以不使用关键字override。

abstract class Father
def fun1=1
def fun2:Int

class Child extends Father
override def fun1=2
def fun2=1

Scala object

Scala中没有static关键字,因此Scala的类中不存在静态成员。但是Scala可以使用object关键字实现单例模式。单例对象就是在整个程序中只有这么一个实例。object对象与类的区别在于object对象不能带参数

object Person
val age=10
def getAge=age

包含main方法的object对象可以作为程序的入口点。另外,当单例对象与某个类共享同一个名称时,单例对象被称作是这个类的伴生对象,类被称为是这个单例对象的伴生类。类和它的伴生对象可以互相访问其私有成员。必须在同一个源文件里定义类和它的伴生对象。

定义一个类Person,类中有私有成员name和私有方法getSkill,再定义类的伴生对象,伴生对象访问了伴生类的私有成员及私有方法,而伴生类访问了伴生对象的私有成员skill。
class Person private(val name:String)
private def getSkill()=name+"s skill is:"+Person.skill

object Person
private val skill="basketball"
private val person=new Person("Tracy")
def printSkill=println(person.getSkill())
def main(args:Array[String]):Unit=
Person.printSkill


Scala模式匹配

scala> def matchTest(x:Int)=x match
     | case 1=>print("one")
     | case 2=>print("two")
     | case _=>print("many")
     | 
matchTest: (x: Int)Unit

scala> matchTest(1)
one
scala> matchTest(3)
many

Scala的match语句不需要break语句,每个case都有一个隐含的break存在,只要发现有一个匹配的case,剩下的case不会继续匹配。

scala> def matchTest(x:List[Int])=x match
     | case List(0,_,_)=>print("列表x有3个元素,并且第一个元素是0")
     | case List(1,_*)=>print("列表x有任意个元素,并且第一个元素是1")
     | case List(_,1,_*)=>print("列表至少有两个元素,并且第二个元素是1")
     | 
matchTest: (x: List[Int])Unit

scala> val a:List[Int]=List(0,1,2)
a: List[Int] = List(0, 1, 2)

scala> val b:List[Int]=List(1,0,2,3,4)
b: List[Int] = List(1, 0, 2, 3, 4)

scala> val c:List[Int]=List(5,1,0,2,3,4)
c: List[Int] = List(5, 1, 0, 2, 3, 4)

scala> matchTest(a)
列表x有3个元素,并且第一个元素是0
scala> matchTest(b)
列表x有任意个元素,并且第一个元素是1
scala> matchTest(c)
列表至少有两个元素,并且第二个元素是1

Scala读写文件

scala> import java.io._
import java.io._

scala> val pw=new PrintWriter(new File("/home/hadoop/桌面/ScalaLearn/test.txt"))
pw: java.io.PrintWriter = java.io.PrintWriter@76b07f29

scala> pw.write("I like Scala")

scala> pw.close

scala> import scala.io.Source
import scala.io.Source

scala> Source.fromFile("/home/hadoop/桌面/ScalaLearn/test.txt").foreachprint
I like Scala

Scala练习题

编写函数过滤文本中的回文单词

vim pdhuiwen.scala

object pdhuiwen
    def main(args:Array[String]):Unit=
    //测试回文
    import scala.io.StdIn
    println("请输入单词:")
    val x=StdIn.readLine()
    if(x==x.reverse)
    println(x)
    else println("不是回文")
    

hadoop@master:~/桌面/ScalaLearn$ scalac pdhuiwen.scala 
hadoop@master:~/桌面/ScalaLearn$ scala pdhuiwen
请输入单词:
mom
mom
hadoop@master:~/桌面/ScalaLearn$ scala pdhuiwen
请输入单词:
scala
不是回文

使用Scala编程输出杨辉三角

vim yhsj.scala 

import scala.io.StdIn
object yhsj
    def main(args:Array[String]):Unit=
    val num = pascal()
    val Value = Array.ofDim[Int](num,num)

    for (i <- 0 until num)  //行
      for (j <- 0 to i)  //列
        if (j == 0 || j == i) Value(i)(j) = 1
        else Value(i)(j) = Value(i - 1)(j - 1) + Value(i - 1)(j)
        print(Value(i)(j) + "\\t")
      
      println()
    
  

  def pascal():Int=
    println("请输入行列值:")
    val num:Int = StdIn.readInt()
    num
    



hadoop@master:~/桌面/ScalaLearn$ scalac yhsj.scala 
hadoop@master:~/桌面/ScalaLearn$ scala yhsj
请输入行列值:
11
1	
1	1	
1	2	1	
1	3	3	1	
1	4	6	4	1	
1	5	10	10	5	1	
1	6	15	20	15	6	1	
1	7	21	35	35	21	7	1	
1	8	28	56	70	56	28	8	1	
1	9	36	84	126	126	84	36	9	1	
1	10	45	120	210	252	210	120	45	10	1
hadoop@master:~/桌面/ScalaLearn$ 

求100~999之间的所有水仙花数

个位十位百位,3个数的立方和等于这个数的本身
例如:1x1x1+5x5x5+3x3x3=153

vim sxhs.scala

object sxhs
    def main(args:Array[String]):Unit=
    for(number<-100 to 999)
    val a=number/100
    val b=number%100/10
    val c=number%100%10
    if(a*a*a+b*b*b+c*c*c==number)
    println(number+" ")
            
        
    



hadoop@master:~/桌面/ScalaLearn$ scalac sxhs.scala 
hadoop@master:~/桌面/ScalaLearn$ scala sxhs
153 
370 
371 
407 

以上是关于Scala基础学习03的主要内容,如果未能解决你的问题,请参考以下文章

水仙花数(Java语言)——最基础全面的讲解

Scala学习(函数式编程面向对象编程)

Scala学习(函数式编程面向对象编程)

Problem03 水仙花数

Scala:基础知识03

C语言,编程打印,1000以内所有的水仙花数,所谓水仙花数是指一个三位数,其个位数字立方和等于该数