(大数据开发随笔4)Scala编程语言基础——Scala集合

Scala集合

可变集合、不可变集合

val math = scala.collection.immutable.Map("Alice"->80, "Bob"->90) // 不可变
val chinese = scala.collection.mutable.Map("Alice"->80, "Bob"->90) // 可变

// 获取值
chinese("bob")
chinese.contains("Bob")
chinese.getOrElse("Bob1", -1)

// 修改更新可变集合中的值
chinese("Bob") = 100
chinese += "Jerry"->70
chinese -= "Bob"

// 迭代
chinese.foreach(println)

可变列表、不可变列表

// 不可变列表
val nameList = List("Mary", "Tom"),
val numList = List(1, 2, 3)
val nullList:List[Nothing] = List() // 空列表
val din:List[List[Int]] = List(List(1,2), List(3,4)) // 二维列表
// 操作
nameList.head // 第一个
nameList.tail // 除第一个外的

// 可变列表:可修改值
val myList = mutable.LinkedList(1,2,3)
// 操作
val cur = myList // 定义一个指针
while(cur != Nil){ // 当指针不等于null时
    // 对当前值乘以2
    cur.elem = cur.elem * 2
    // 把指针指向下一个值
    cur = cur.next
}

序列

  • Vector:带下标的序列

    val v = Vector(1,2,3,4,5,6)
    v.find(_ > 3) // 返回第一个满足条件的元素
    v.updated(2, 100) // 更新下标(从0开始)为2的元素
    
  • Range:整数序列

    Range(0, 5) // Range(0,1,2,3,4)
    (0 until 5) // 同上
    (0 to 4) // 同上
    
    // 操作
    ('0' to '9') ++ ('A' to 'Z') // Vector(0,1,...,9,A,B,...,Z)
    1 to 5 toList // List(1,2,3,4,5)
    

  • set:不重复元素的集合
val s1 = Set(10,2,0,1)
s1 += 0 // 不变
s1 += 100

var weeksDay = LinkedHashSet('星期一', '星期二') // LinkedHashSet
weeksDay + '星期三'
weeksDay.contains("星期二")
set("星期一").subsetOf(weeksDay) // 判断是否为子集

// 交intersect、并union、补diff
var set1 = Set(1,2)
var set2 = Set(2,3)
set1 union set2

var s2 = SortedSet(1,10, 2, 6) // /可排序的set(自动)

模式匹配

  • scala中switch case语句
var ch1 = '-'
var flag = 0
ch1 match{
    case '+' => flag = 1
    case '-' => flag = -1
    case _ => flag = 0
}

// 匹配数字
var ch2 = '6'
var digit:Int = -1
ch2 match{
    case '+' => println('这是一个加号')
    case '-' => println('这是一个减号')
    case _ if Character.isDigit(ch2) => digit = Character.digit(ch2, 10) // 10表示按照十进制转换
    case _ => println('其他类型')
}

// 使用变量
var str3 = 'hello world'
str3(7) match{
    case '+' => println('这是一个加号')
    case '-' => println('这是一个减号')
    case ch => println('这个字符是:' + ch)
}

// 类型的模式
var v4:Any = 100 // Any: 任意类型,类似于java中的Object(所有类的父类)
v4 match{
    case x:Int => println("整数")
    case s:String => println("字符串")
    case _ => print("其他")
}

// 数组和列表
var myArray = Array(1,2,3)
myArray match{
    case Array(0) => println('数组中只有0')
    case Array(x,y) => println('该数组包含两个元素')
    case Array(x,y,z) => println('该数组包含三个元素,和是:' + (x+y+z))
    case Array(x, _*) => pritnln('这是一个数组')
} // 列表同

样本类

  • 在class前面加关键字case

  • 好处:支持模式匹配,类似isinstance;使用样本类来定义DataFrame(表)Schema(表的结构)

class Vehicle

case class Car(name:String) extends Vehicle
case class Bike(name:String) extends Vehicle

var car:Vehicle = new Car("汽车")
car match{
    case Car(name) => println('这是汽车')
    case Bike(name) => print('这是自行车')
    case _ => println('其他')
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值