码迷,mamicode.com
首页 > 其他好文 > 详细

Scala集合类型详解

时间:2020-07-03 01:11:07      阅读:83      评论:0      收藏:0      [点我收藏+]

标签:取出   ++   ali   app   扩展   递归   value   表示   区别   

 

作者介绍:EVETNT,狐小E资深开发工程师,专注移动协同办公平台的SAAS软件开发以及轻应用开发

最近开发了一款移动办公软件狐小E

1. Scala集合

   Scala提供了一套很好的集合实现,提供了一些集合类型的抽象。

   Scala 集合分为可变的和不可变的集合。

   可变集合可以在适当的地方被更新或扩展。这意味着随时可以修改,添加,移除一个集合的元素。

   而不可变集合类永远不会改变。但是,你仍然可以模拟添加,移除或更新操作。但这些操作将在每一种情况下都返回一个新的集合,同时使原来的集合不发生改变。

2. 数组Array

   Scala语言中提供的数组是一种可变的、可索引的数据集合。在Scala中用Array[T]的形式来表示

定常数组:

main方法

object ArrayApp {
    def main(args: Array[String]): Unit = {
      println("test")
    }
}

scala简写

object ArrayApp extends App{
  println("test")
}

创建数组:

object ArrayApp extends App{
  val a = new Array[String](5)
  println(a.mkString(","))
}

输出如下

 

a.length=取得是数组长度

println(a.length)
 
输出
5

a(0) = "hello"   //给数组里的 第0位 赋值

 

另一种创建数组方式

val b =Array("A","B","C")

 

数组计算函数

val c =Array(1,2,3,4,5,6,7,8,9)

val c1 =c.sum
val c2 =c.min
val c3 =c.max
println(c1,c2,c3)
 
输出如下
(45,1,9)
mkString 的使用方法
 
println(c.mkString("<",",",">"))
 
输出
<1,2,3,4,5,6,7,8,9>

变长数组

val a = scala.collection.mutable.ArrayBuffer[Int]()
//累加赋值的几种方法
a += 1   
a += 2  
a += (3,4,5)
a ++= Array(6,7,8)
a.insert(0,0)
 
//消减赋值的几种方法
a.remove(1)     //删除数组位置1的数据
a.remove(0,3)    //删除数组位置从0开始前三位的数据
a.trimEnd(2)    //删除数组位置后2位的数据

println(a)
输出
ArrayBuffer(0, 1, 2, 3, 4, 5, 6, 7, 8)

ArrayBuffer是可变数组,通过toArray转换成不可变数组

a.toArray
 
println(a.toArray.mkString(","))
 
输出
456

遍历数组的三种方法

1

for(i <- 0 until a.length ) {
  println(a(i))
}

2

for(ele <- a){
  println(ele)
}

3

for(i <- (0 until a.length).reverse {
  println(a(i))
}

3. List

   Scala 列表类似于数组,它们所有元素的类型都相同,但是它们也有所不同:列表是不可变的,值一旦被定义了就不能改变,其次列表 具有递归的结构(也就是链接表结构)而数组不是。列表的元素类型 T 可以写成 List[T]。

Nil:表示为一个空列表,而且是一个不可变的列表

 

list的组成:head,tail

list = head(Element) +tail(Element),除了头部以外的元素都是尾

  1. head 返回列表第一个元素
  2. tail 返回一个列表,包含除了第一元素之外的其他元素:(是一个列表或者Nil)
object ListApp extends App{

  val l =List(1,2,3,4,5,4,3,2,1)

  println(l.head)
  println(l.tail)

  println(l.mkString(","))
}
输出如下
1
List(2, 3, 4, 5, 4, 3, 2, 1)
1,2,3,4,5,4,3,2,1

l5.taul.head的用法

  val l5 =Lis (1,2,3,4,5)
  println(l5.tail)
  println(l5.tail.head)
输出
ListBuffer(2, 3, 4, 5)
2

常用示例:

  def sum(nums:Int*):Int={
    if(nums.length ==0){
      0
    } else{
      nums.head +sum(nums.tail:_*)
    }
  }

  println(sum())
  println(sum(1,2,3,4))
输出
  0
  10

构造列表另一基本单位”::”的作用

(::)符号起到链接的作用,连接顺序是从右到左

  val l1 = 1 :: Nil
 
val l2 = 2 :: l1
 
val l3= 1 :: 2 :: 3 :: Nil
 
println(l1)
  println(l2)
  println(l3)

输出如下
List(1)
List(2, 1)
List(1, 2, 3)

变量列表

val l5 =scala.collection.mutable.ListBuffer[Int]()
//累加赋值的几种方法
l5 += 2
l5 += (3,4,5)
l5 ++=List(6,7,8,9)

//消减赋值的几种方法

l5 -= 2     //删除列表里数字2数据
l5 -=(1,4)  //删除列表里数字1和4数据
l5 --=List(5,6,7,8) //删除列表里数字5,6,7,8数据
println(l5)

ListBuffer是可变列表,通过toList 转换成不可变列表,也可以通过toArray转换成不可变数组

 
//
l5.toList   
输出:
List(3, 9)
 
 
l5.toArray
输出
Array(3, 9)

isEmpty 的使用:在列表为空时返回true

l5 += 2
println(l5.isEmpty)
输出
false

4. Set

与其他任何一种编程语言一样,Scala中的Set集合类具有如下特点: 
1.不存在有重复的元素。 
2.集合中的元素是无序的。换句话说,不能以索引的方式访问集合中的元素。 
3.判断某一个元素在集合中比Seq类型的集合要快。

Scala中的集合分为可变与不可变两种,对于Set类型自然也是如此。默认情况下,Scala 使用的是不可变集合,如果想使用可变集合,需引用 scala.collection.mutable.Set 包。

不可变集合

val a =Set(1,2,3,2,1,4,5,6,1,2)
println(a)
输出
HashSet(5, 1, 6, 2, 3, 4)

可变集合

val b =scala.collection.mutable.Set[Int]()
  b += 1
  b +=(1,2)
println(b)
输出
HashSet(1, 2)

注意:集合添加或删除元素的操作和列表大同小异。

      虽然可变Set和不可变Set都有添加或删除元素的操作,但是有一个非常大的差别。对不可变Set进行操作,会产生一个新的set,原来的set并没有改变,这与List一样。 而对可变Set进行操作,改变的是该Set本身,与ListBuffer类似

  1. 5.  Map

Map(也叫哈希表(Hash tables))这种数据结构是日常开发中使用非常频繁的一种数据结构,所有的值都可以通过键来获取。Map作为一个存储键值对的容器(key-value),其中key值必须是唯一的。

Map 有两种类型,可变与不可变,区别在于可变对象可以修改它,而不可变对象不可以。 默认情况下,我们可以通过Map直接创建一个不可变的Map容器对象,这时候容器中的内容是不能改变的。如果你需要使用可变集合,你需要显式的引入 import scala.collection.mutable.Map 类。

在 Scala 中 你可以同时使用可变与不可变 Map,不可变的直接使用 Map,可变的使用 mutable.Map。

创建Map(不可变)

val a = Map("A" -> 91,"B" -> 77)  //创建Map
println(a)
输出
Map(A -> 91, B -> 77)

Scala Map 几种基本操作:keys、values、

println(a("A"))
 println(a("B"))
输出
 91
 77

 

println( "a 中的键为 : " + a.keys )
println( "a 中的值为 : " + a.values )
a 中的键为 : Set(A, B)
a 中的值为 : Iterable(91, 77)

可变Map

val b =scala.collection.mutable.Map[String,Int]()
 b += ("A" -> 91)

get 的使用

println(b.get("A"))
println(b.get("A").get)
输出
Some(91)
91

getOrElse 的使用(如果有就取出,没有就用默认值“0”)

  println(b.getOrElse("A",0))
  println(b.getOrElse("B",0))
//  输出
  91
  0

多种FOR循环取值方式

for((key,value) <- b){
  println(key + " : " + value)
}

for(key <- b.keySet){
  println(key + " : " + b.getOrElse(key,0))
}

for(value <- b.values){
  println(value)
}

for((key,_) <- b){
  println(key + " : " + b.getOrElse(key,0))
}

 

作者介绍:EVETNT,狐小E资深开发工程师,专注移动协同办公平台的SAAS软件开发以及轻应用开发

 

 

最近开发了一款移动办公软件狐小E

Scala集合类型详解

标签:取出   ++   ali   app   扩展   递归   value   表示   区别   

原文地址:https://www.cnblogs.com/eetv/p/13227784.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!