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").foreach{print}
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 
  • 0
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

数据攻城小狮子

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值