scala的基本语法:集合

集合

Iterable特质常用方法

可变集合

1 . 不可变集合继承层次一览图

在这里插入图片描述

ArrayBuffer转javalist(生产常用)

  val arr = ArrayBuffer("1", "2", "3") //JavaList
    /*bufferAsJavaList 是一个隐式函数:
    implicit def bufferAsJavaList[A](b : scala.collection.mutable.Buffer[A]) : java.util.List[A] =
     */
    import scala.collection.JavaConversions.bufferAsJavaList
    val javaArr = new ProcessBuilder(arr) //只能接受list 返回ProcessBuilder 对象
    val arrList = javaArr.command() //返回ava.util.List
    println(arrList) //输出 [1, 2, 3]
可变集合注意事项
  1. Set、Map是Java中也有的集合
  2. Seq是Java没有的,我们发现List归属到Seq了,因此这里的List就和java不是同一个概念了
  3. 我们前面的for循环有一个 1 to 3 , 就是IndexedSeq 下的Vector
  4. String也是属于IndexeSeq
  5. 我们发现经典的数据结构比如Queue 和 Stack被归属到LinearSeq
  6. 大家注意Scala中的Map体系有一个SortedMap,说明Scala的Map可以支持排序
  7. IndexedSeq 和 LinearSeq 的区别[IndexSeq是通过索引来查找和定位,因此速度快,比如String就是一个索引集合,通过索引即可定位] [LineaSeq 是线型的,即有头尾的概念,这种数据结构一般是通过遍历来查找,它的价值在于应用到一些

元组Tuple

​ 元组也是可以理解为一个容器,可以存放各种相同或不同类型的数据。将多个无关的数据封装为一个整体,称为元组, 最大的特点灵活,对数据没有过多的约束。

  1. 元组t1 的类型取决于 t1 后面有多少个元素, 有对应关系,比如 4个元素=》Tuple4 ,因为类型与个数关联所以底层效率高
  2. 注意:元组中最大只能有22个元素
  3. 两种访问方法:
    • 符号 .__ 下标从1开始
    • 方法productElement 下标从0开始 方法本质上还是用的 .__
  4. 元组可以包含元组,类似数组,取用.__6.__4
  5. Tuple是一个整体,遍历需要调其迭代器。

列表List

​ Scala中的List 和Java List 不一样,在Java中List是一个接口,真正存放数据是ArrayList,而Scala的List可以直接存放数据,就是一个object,默认情况下Scala的List是不可变的,List属于序列Seq。

  1. List默认为不可变的集合

  2. List 和Nil 在 scala包对象声明的,因此不需要引入其它包也可以使用val List = scala.collection.immutable.List 或.Nil

  3. List 中可以放任何数据类型,比如 arr1的类型为 List[Any] 可以指定泛型。

  4. 特殊集合空集合 如果希望得到一个空列表list()

  5. 索引同数组从0开始

  6. 向列表中增加元素, 会返回新的列表/集合对象,与Java不同

①list 不可变有序列表

  1. 增加数据 :+ 或者**+:** (向后面或前面插入数据)

  2. 列表后增加数据 ::或者:::

    • 符号 ::相当于把前面的集合当做元素连同后面集合元素放到新集合中,a::b与b::a不一样。

          val a =List(1,2)
          val b = List(3,4)
          println(a::b) //List(List(1, 2), 3, 4)
          println(b::a) //List(List(3, 4), 1, 2)
      
    • 运算时,集合对象一定要放置在最右边

    • 运算规则,从右向左,列表从末端开始创建

    • ::: 运算符是将集合中的每一个元素加入到一个新的空集合中去(集合间操作)

    val list1 = List(1, 2, 3, "abc")
    val list7 = 4 :: 5 :: 6 :: list1 ::: Nil //结果是List(4, 5, 6, 1, 2, 3, "abc")
    val list7 = 4 :: 5 :: 6 :: list1 :: Nil //结果是List(4, 5, 6, List(1, 2, 3, abc))
    

② ListBuffer 可变列表

​ ListBuffer是可变的list集合,可以添加,删除元素,ListBuffer属于序列。需要import scala.collection.mutable.ListBuffer

方法

  1. += 元素
  2. ++= 集合操作 添加List or ListBuffer
  3. lst1.append()方法 一个无返回值的方法 用的是++=
  4. list.remover()
    lst1 += 4 	//ListBuffer(4)
    lst1.append(5) 	//ListBuffer(4,5)
    lst0 ++=  lst1 	// 集合操作

队列 Queue

  1. 队列是一个有序列表,在底层可以用数组或是链表来实现。

  2. 其输入和输出要遵循先入先出的原则。即:先存入队列的数据,要先取出。后存入的要后取出

  3. 在Scala中,由设计者直接给我们提供队列类型使用。

  4. 在scala中, 有 scala.collection.mutable.Queue 和 scala.collection.immutable.Queue , 一般来说,我们在开发中通常使用可变集合中的队列。

    方法

  5. += 当泛型未Any时

  6. ++= List(2,9) 集合间操作

  7. q1.dequeue() 删除

  8. q1.enqueue(20,60) 增加

  9. 返回队列的第一个元素

println(q1.head) //对队列本身没有任何影响
  1. 返回队列最后一个元素
println(q1.last) //对队列本身没有任何影响
  1. 返回队列的尾部 即:返回除了第一个以外剩余的元素, 可以级联使用,这个在递归时使用较多。
println(q1.tail)
println(q1.tail.tail)

集set

★★映射 Map

Scala中的Map 和Java类似,也是一个散列表,它存储的内容也是键值对(key-value)映射,Scala中不可变的Map是有序的,可变的Map是无序的。

创建

  1. 构造不可变映射 有序,元素底层是Tuple2类型
val map1 = Map("Alice" -> 10, "Bob" -> 20, "Kotlin" -> "北京")
  1. 构造可变映射 创建可变Map需要指定可变Map的包:scala.collection.mutable.Map
val map2 = scala.collection.mutable.Map("Alice" -> 10, "Bob" -> 20, "Kotlin" -> 30)
  1. 创建空的映射
val map3 = new scala.collection.mutable.HashMap[String, Int]
println(map3)
  1. 对偶元组 对偶元组 就是只含有两个数据的元组
val map4 = mutable.Map( ("A", 1), ("B", 2), ("C", 3),("D", 30) )
println("map4=" + map4)
println(map4("A"))

取值

  1. 使用map(key)

    与Java不同,如果key不存在scala则抛出异常[java.util.NoSuchElementException],在Java中是返回null。

val value1 = map2("Alice") 
  1. 使用map.get(key).get
    • map.get方法会将数据进行包装,返回一个Option对象Some(value)或者None
    • map.get(key).get key如果不存在,会抛出异常 java.util.NoSuchElementException: None.get
var map4 = mutable.Map( ("A", 1), ("B", "北京"), ("C", 3) )
println(map4.get("A")) //Some(1) 
println(map4.get("A").get) //1  相当于Some(1).get
  1. 使用contains方法检查是否存在key
  2. 使用map.getOrElse()
    • key存在,返回key对应的值
    • key不存在返回默认值,不会抛出异常
    • 原理还是contains
map1.getOrElse("A","不存在就返回本默认值"))
map2.getOrElse(c, 0) 
原文地址:https://www.cnblogs.com/successok/p/14737325.html