Scala集合
Array:
定长数组
变长数组
+=/++=/insert
定长数组:
object ArrayApp extends App{
val a = new Array[string](5)
a.length //查看数组长度
a(1) = "hello" //赋值,下标从0开始
val b = Array("hadoop","spark", "storm") //直接赋值
b(1) = "flink" //修改值
val c = Array(2,3,4,5,6,7,8,9)
c.sum
c.min
c.max
c.mkString
c.mkString(",")
c.mkString(" and ")
}
变长数组:
val d = scala.collection.mutable.ArrayBuffer[Int] ()
d += 1
d += 2
d += (3,4,5)
d ++= Array(6,7,8)
d.insert(0,0) //在第0个位置插入数值0
d.remove(1) //删除下标1的数值
d.remove(0,3) //删除下标0到3的数值
d.trimEnd(2) //从尾部开始删除
d.toArray //把可变的转成不可变的。
println(d)
//取集合
for(i <- 0 until d.length) {
println(d(i))
}
for(ele <- d) {
println(ele)
}
取反的集合
for(i <- (0 until d.length).reverse) {
println(d(i))
}
List:
Nil 就是一个不可变的list(),可以当做一个空的集合。
scala> Nil
res0: scala.collection.immutable.Nil.type = List() //不可变的List()
object ListApp extends App{
val l = List(1,2,3,4,5)
}
一个list就是由head和tail组合的。
scala> l.head //head就是第一个元素
res1: Int = 1
scala> l.tail //tail就是剩下的元素
res2: List[Int] = List(2,3,4,5)
scala> val l2 = 1 :: Nil //:: 就是把1当成head,把后面当成tail拼成一个list。
l2: List[Int] = List(1)
scala> val l3 = 2 :: l2
l2: List[Int] = List(2,1)
scala> val l4 = 1 :: 2 :: 3 :: Nil
l4: List[Int] = List(1,2,3)
val l5 = scala.collection.mutable.ListBuffer[Int] () //变长List
l5 += 2
l5 += (3,4,5)
l5 ++= List(7,8,9)
l5 -= 2
l5 -= 3
l5 -= (1,4) //不会报错,有就减掉没有就算了。
l5 --= List(7,8,9)
l5.toList //转成定长的
l5.toArray //转成Array
l5.isEmpty //是否为空
l5.tail.head
def sum(nums:Int*):Int = {
if(nums.length == 0) {
0
} else {
nums.head + sum(nums.tail:_*) //:_* 转成可变参数,其实就是个递归。
}
}
println(sum())
println(sum(1,2,3,4))
Set:
scala> val set = Set(1,2,2,1,4,3)
set : scala.collection.immutable.Set[Int] = Set(1,2,4,3) //去掉重复的数据了。
Map:
import scala.collection.mutable
import scala.collection.mutable._
object MapApp extends App{
val a = Map("PK" -> 18, "zhangsan" -> 30) //不可变的
val b = scala.collection.mutable.Map("PK" -> 18, "zhangsan" -> 30) //可变的
val c = mutable.HashMap[String,Int] ()
b.getOrElse("PK",9) //得到就得到了,没得到的话就放一个默认值进去。
b("list") = 40 //添加一个参数
b += ("wangwu" ->4, "zhaoliu" ->5)
b -= "wangwu"
遍历:
第一种方式:
for((key,value) <- b) {
println(key + " : " + value)
}
第二种方式:
for(key <- b.keySet) {
println(key + " : " + b.getOrElse(key, 9))
}
直接取value
for(value <- b.values) {
println(value)
}
for((key,_) <- b) {
println(key + " : " + b.getOrElse(key, 9))
}
}
Array/List/Map 不可变
ArrayBuffer/ListBuffer/ 可变
Option&Some&None之间的关系:
scala> b.get("PK")
res17: Option[Int] = Some(16) //类型是Option的
scala> b.get("PK1")
res17: Option[Int] = None
Some的源码:
final case class Some[+A] (x: A) extends Option[A] {
def isEmpty = false //如果是Some就不为空,把KEY get取出来就行。
def get = x
}
None的源码:
case object None extends Option[Nothing] {
def isEmpty = true //如果是None就为空
def get = throw new NoSuchElementException("None.get")
}
val m = Map(1 -> 2) //key是1,value是2
println(m(1)) // true
println(m(2)) //error
//取2的值
println(m.get(1).get)
2
println(m.getOrElse(2, "None"))
None
Option None Some各自的写法:
abstract class Option[+A]
case class Some[+A](x: A) extends Option[A]
case object None extends Option[Nothing]
Tuple : 元组
// 元组:(........) 下标从1开始。
object TupleApp extends App{
val a = (1,2,3,4,5)
a._1
for(i <- 0 until(a.productArity)) {
println(a.productElement(i))
}
val hostPort = ("localhost",8080)
hostPort._1
hostPort._2
}