Scala中集合的分类
Scala。collection。immutable --------不可变的
Scala.collection。mutable--------可变的
set集合
和Java中set几乎一样:元素不重复,元素无排序
分为:可变set 不可变set
是否为可变还是不可变,是取决于导包
scala> val a1=set(1,2,3) //Scala中特别注重首字母大小写,这个问题就是首字母小写形成错误的
<console>:11: error: not found: value set
val a1=set(1,2,3)
^
scala> val a1=Set(1,2,3) //首字母大写,正确写法 但值得注意的是,目前么有导包显示immutable
a1: scala.collection.immutable.Set[Int] = Set(1, 2, 3) //所以Scala中默认集合为不可变集合
scala> a1 + 5 //集合添加一个新元素,返回一个新集合,
res0: scala.collection.immutable.Set[Int] = Set(1, 2, 3, 5)
scala> a1 //原来的a1集合元素内容没有变
res1: scala.collection.immutable.Set[Int] = Set(1, 2, 3)
scala> val a2= a1 +5 //返回一个新集合,也是不可变集合
a2: scala.collection.immutable.Set[Int] = Set(1, 2, 3, 5)
scala> a2
res2: scala.collection.immutable.Set[Int] = Set(1, 2, 3, 5)
scala> val a3 = a1 - 3 //删除集合里面的元素,但是a1集合内容还是不变的,只是得到的结果返回个新集合
a3: scala.collection.immutable.Set[Int] = Set(1, 2)
scala> a1
res3: scala.collection.immutable.Set[Int] = Set(1, 2, 3)
scala> val a4 = a1 ++ Set(4,5,6) //添加新集合内容
a4: scala.collection.immutable.Set[Int] = Set(5, 1, 6, 2, 3, 4)
scala> val a5 ++ List(7,8,9) //错误写法,添加新列表 没有赋值等号,跟参数
|
| val a5 ++ List(7,8,9)
<console>:3: error: '=' expected but ';' found.
val a5 ++ List(7,8,9)
^
scala> val a5 = a1 ++ List(7,8,9) //添加新列表的正确格式
a5: scala.collection.immutable.Set[Int] = Set(1, 9, 2, 7, 3, 8)
scala> a1 //不管添加,删除 原有的集合内容是不会变的
res4: scala.collection.immutable.Set[Int] = Set(1, 2, 3)
scala> a5 //只是把结果返回得到一个新集合
res5: scala.collection.immutable.Set[Int] = Set(1, 9, 2, 7, 3, 8)
可变set:
scala> import scala.collection.mutable.Set //可变set需要导包
import scala.collection.mutable.Set
scala> val a1=Set(1,1,2,2,3,3,4,5,5,6,6,7,8,8,9,9) //设置一个可变set 可以看出来set集合的特点
a1: scala.collection.mutable.Set[Int] = Set(9, 1, 5, 2, 6, 3, 7, 4, 8) //不重复,无序性
scala> val a2 = a1 += 11 //可变Set和不可变Set 在添加元素时所有不同
a2: a1.type = Set(9, 1, 5, 2, 6, 3, 7, 4, 11, 8)
scala> val a3 = a1 -= 9 //可变Set和不可变Set 在删除元素时所有不同
a3: a1.type = Set(1, 5, 2, 6, 3, 7, 4, 11, 8)
scala> a1 //切记,可变set的元素内容回随着添加,删除的变化而变化,
res12: scala.collection.mutable.Set[Int] = Set(1, 5, 2, 6, 3, 7, 4, 11, 8)
Map映射:
Map映射是一推 对偶元组(就是只有两个元素的列表,或者也是kv键值对)的集合
分为:可变Map 不可变Map
默认情况下都是不可变的 而可变Map需要自己手动导包
import scala.collection.mutable.Map
scala> val a1=Map("name"->"DW","age"->"28") //创建map集合第一种格式
a1: scala.collection.immutable.Map[String,String] = Map(name -> DW, age -> 28)
scala> val a2=Map(("name","DW"),("age","28")) //创建map集合第二种格式
a2: scala.collection.immutable.Map[String,String] = Map(name -> DW, age -> 28)
scala> scala.collection.mutable.Map //错误导包方式
res13: collection.mutable.Map.type = scala.collection.mutable.Map$@4250b0c1
scala> import scala.collection.mutable.Map //正确导包方式
import scala.collection.mutable.Map
scala> val a3=Map(("name","kk"),("age","55")) //创建可变map集合
a3: scala.collection.mutable.Map[String,String] = Map(age -> 55, name -> kk)
scala> a1("name") //根据key值求value的值
res14: String = DW
scala> a3("name") //根据key值求value的值
res15: String = kk
scala> a1("name2") //根据kay值求value的值,如果没有这个key值,会报错
java.util.NoSuchElementException: key not found: name2
at scala.collection.MapLike$class.default(MapLike.scala:228)
at scala.collection.AbstractMap.default(Map.scala:59)
at scala.collection.MapLike$class.apply(MapLike.scala:141)
at scala.collection.AbstractMap.apply(Map.scala:59)
... 32 elided
scala> a1.get("name") //用get方法取值
res17: Option[String] = Some(DW)
scala> a1.get("name2") //如果没有相应的v值,会返回:None
res18: Option[String] = None
//用getorelse方法,最大好处就是没有相应的key值,会返回自己指定的内容
scala> a1.getOrElse("name","hello")
res19: String = DW
scala> a1.getOrElse("name2","hello")
res20: String = hello
scala> a1.kays //取所有的key值,注意书写规范
<console>:15: error: value kays is not a member of scala.collection.immutable.Map[String,String]
a1.kays
^
scala> a1.keys //取所有的key值
res22: Iterable[String] = Set(name, age)
scala> a1.values //取所有的value值
res23: Iterable[String] = MapLike(DW, 28)
可变Map的操作:
scala> a3 //在上面都a3的内容了 看是不是可变还是不变就看系统提示字符里是mutable还是immutable呢
res24: scala.collection.mutable.Map[String,String] = Map(age -> 55, name -> kk)
scala> a3("name")="city" //修改指定的k值
scala> a3 //完成修改后的内容
res26: scala.collection.mutable.Map[String,String] = Map(age -> 55, name -> city)
scala> a3.+=("hobby"->"playball") //添加内容,注意+=在这里相当于方法一样
res27: a3.type = Map(hobby -> playball, age -> 55, name -> city)
scala> a3.+=("city","shanxi") //添加内容,注意+=在这里相当于方法一样(第二种格式)
<console>:15: error: type mismatch; //注意书写规范,上个括号kv的圆括号
found : String("city")
required: (String, String)
a3.+=("city","shanxi")
^
<console>:15: error: type mismatch;
found : String("shanxi")
required: (String, String)
a3.+=("city","shanxi")
^
scala> a3.+=(("city","shanxi")) //添加内容,注意+=在这里相当于方法一样(第二种格式)
res29: a3.type = Map(city -> shanxi, hobby -> playball, age -> 55, name -> city)
scala> a3.+=(("city","shanxi"),("hadoop","mapreduce")) //也可以添加多个kv值
res30: a3.type = Map(hadoop -> mapreduce, city -> shanxi, hobby -> playball, age -> 55, name -> city)
scala> a3 -=("hobby") //注意在删除k时,-=不是以方法存在的 值得注意一点
res31: a3.type = Map(hadoop -> mapreduce, city -> shanxi, age -> 55, name -> city)
scala> a3.ermove("city") //第二种删除方式 注意书写格式
<console>:15: error: value ermove is not a member of scala.collection.mutable.Map[String,String]
a3.ermove("city")
^
scala> a3.remove("city") //第二种正确的格式
res33: Option[String] = Some(shanxi)
scala> a3 //因为是可变map,所以在添加删除修改后,原本的a3Map集合kv内容发生了改变
res34: scala.collection.mutable.Map[String,String] = Map(hadoop -> mapreduce, age -> 55, name -> city)
Map的遍历:
scala> for(i <- a3)println(i)
(hadoop,mapreduce)
(age,55)
(name,city)
scala> for(k <- a3.keys)println(s"${k}---->${a3(k)}") //用s表达式插入数据,
hadoop---->mapreduce //如不理解s表达式
age---->55 //可以在基础语法第一讲最后结尾除查看
name---->city //算了 我还是在下面演示一下吧
scala> for((k,v)<-a3)println(s"$k---->$v")
hadoop---->mapreduce
age---->55
name---->city
s表达式拼接:
//s表达式拼接
scala> val a="hello"
a: String = hello
scala> val b="wangjie"
b: String = wangjie
scala> val c = s"$a---->$b"
c: String = hello---->wangjie
scala> val d = s"$(a)123 \\wusuiwei// \\yanggun// 123$(b)" //注意要用{} 花括号
<console>:1: error: invalid string interpolation: `$$', `$'ident or `$'BlockExpr expected
val d = s"$(a)123 \\wusuiwei// \\yanggun// 123$(b)"
^
scala> val d = s"${a}123 \\wusuiwei// \\yanggun// 123${b}" //正确用法
d: String = hello123 \wusuiwei// \yanggun// 123wangjie
//一般方式拼接
scala> val e = a+b
e: String = hellowangjie
scala> val f = a+"---->"+b
f: String = hello---->wangjie
scala> val f1 = a+"aaaaa"+b
f1: String = helloaaaaawangjie
scala> val f1 = a+" aaaaa "+b
f1: String = hello aaaaa wangjie