Scala学习笔记------数组和集合

Scala 学习笔记2

一. 数组

1.一维数组

与Java中不同的是,Scala中没有数组这一种类型。在Scala中,Array类的功能就与数组类似。
与所有数组一样,Array的长度不可变,里面的数据可以按索引位置访问。

val array1 = new Array[Int](5)
  array1(0)=1
  array1(4/2)=2
  array1.foreach(println)//output:1 0 2 0 0 
val arr=Array[String]("a","b","c")
    arr.foreach(s=>{println(s)})//三种foreach等价,是匿名函数的写法
    arr.foreach(println(_))
    arr.foreach(println)

2.多维数组

var array=new Array[Array[Int]](3)
    array(0)=Array[Int](1,2,3)
    array(1)=Array[Int](4,5,6)
    array(2)=Array[Int](7,8,9)
  for(arr<-array;elem<-arr){
        println(elem)
    }//output:1 2 3 4 5 6 7 8 9

也可以调用 Array.ofDim

val Matrix = Array.ofDim[Int](3, 4)
    for (i <- 0 to 2) {
      for ( j <- 0 to 2) {
        Matrix(i)(j) = j;
      }
    }
  • 矩阵为:[ [0,1,2,0],[0,1,2,0],[0,1,2,0]]

3.数组的一些方法

def apply( x: T, xs: T* ): Array[T]
创建指定对象 T 的数组, T 的值可以是 Unit, Double, Float, Long, Int, Char, Short, Byte, Boolean。
def concat[T]( xss: Array[T]* ): Array[T]
创建指定对象 T 的数组, T 的值可以是 Unit, Double, Float, Long, Int, Char, Short, Byte, Boolean。
def copy( src: AnyRef, srcPos: Int, dest: AnyRef, destPos: Int, length: Int ): Unit
复制一个数组到另一个数组上。相等于 Java’s System.arraycopy(src, srcPos, dest, destPos, length)。
def fill[T]( n: Int )(elem: => T): Array[T]
返回数组,长度为第一个参数指定,同时每个元素使用第二个参数进行填充。
def ofDim[T]( n1: Int ): Array[T]
创建指定长度的数组
def ofDim[T]( n1: Int, n2: Int ): Array[Array[T]]
创建二维数组
def ofDim[T]( n1: Int, n2: Int, n3: Int ): Array[Array[Array[T]]]
创建三维数组
def range( start: Int, end: Int, step: Int ): Array[Int]
创建指定区间内的数组,step 为每个元素间的步长
def iterate[T]( start: T, len: Int )( f: (T) => T ): Array[T]
返回指定长度数组,每个数组元素为指定函数的返回值。
//一些示例
	var arr1=Array[String]("a","b","c")
    var arr2=Array[String]("d","e","f")
    var arr3=Array.concat(arr1,arr2)
    var arr4=Array.fill(5)("hello")
    val result: Array[Int] = iterate(0,3)(a=>a+1)
    result.foreach(println)  //output:0 1 2

4 可变数组

val arr=ArrayBuffer[Int](1,2,3)
          arr.+=(5)     //添加到后面
          arr.+=:(0)    //添加到前面
          arr.append(7,8,9)//追加多个
          arr.foreach(println) //output: 0 1 2 3 4 5 6 7 8 9

二 . 集合

集合类分为immutable和mutable集合。mutable集合可以在适当的地方被更新或扩展。这意味着你可以修改,添加,移除一个集合的元素。而不可变集合类,与之相反,永远不会改变。不过,你仍然可以模拟添加,移除或更新操作。但是这些操作将在每一种情况下都返回一个新的集合,同时使原来的集合不发生改变。

scala.collection包中所有的集合类
在这里插入图片描述

scala.collection.immutable中的所有集合类
在这里插入图片描述scala.collection.mutable中的所有集合类。
在这里插入图片描述

2.1 list

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

官方网址—> list详解

// 字符串列表
val site: List[String] = List("Runoob", "Google", "Baidu")
// 整型列表
val nums: List[Int] = List(1, 2, 3, 4)
// 空列表
val empty: List[Nothing] = List()
// 二维列表
val dim: List[List[Int]] =
   List(
      List(1, 0, 0),
      List(0, 1, 0),
      List(0, 0, 1)
   )
var list1 =List[String](xs ="hello_scala","hello_hadoop","hello_spark")
	val result1:List[Array[String]]=list1.map(s => {s.split("_")})
	result1.foreach(arr=>{arr.foreach(println)})

	var result2:List[String]=list1.flatMap(s=>{s.split("_")})
	println(result2)

	val result3: List[String] = list1.filter(s => {"hello_scala".equals(s)})
    println(result3)

	var i:Int=list1.count(s=>{s.length <=11})
	println(i)

输出结果:
hello
scala
hello
hadoop
hello
spark
List(hello, scala, hello, hadoop, hello, spark)
List(hello_scala)
2

2.2 Set

Scala Set(集合)是没有重复的对象集合,所有的元素都是唯一的。

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

默认情况下,Scala 使用的是不可变集合,如果你想使用可变集合,需要引用 scala.collection.mutable.Set 包。

默认引用 scala.collection.immutable.Set

官网详解–>set api文档

	val set =Set[Int](1,2,3,4)
    val set1 =Set[Int](3,4,5,6)
    val result =set.intersect(set1)  //求交集
    val result3=set & set1  //运算符求交集
    println(result)
    //result.foreach(println)
    val result1 =set.diff(set1) //求差集
    //result1.foreach(s=>{print(s+" ")})
    println(result1)
    val result2 = set1.diff(set)
    //result2.foreach(s=>{print(s+" ")})
    println(result2)
    val set3: Set[Int] = set.filter(elem=>{elem>2})
    //set3.foreach(println) // output:3 4

输出:
Set(3, 4)
Set(1, 2)
Set(5, 6)

可变set

import scala.collection.mutable
    val set5 =mutable.Set[String]("a","b")
    set5.+=("c") 
    println(set5)
    val set6 = set5.++("d") //输出到一个新的集合
    println(set6)

Set(c, a, b)
Set(c, d, a, b)

2.3 Map

Map(映射)是一种可迭代的键值对(key/value)结构。

所有的值都可以通过键来获取。 Map 中的键都是唯一的。Map 也叫哈希表(Hash tables)。

Map 有两种类型,可变与不可变,区别在于可变对象可以修改它,而不可变对象不可以。 默认情况下 Scala 使用不可变 Map。如果你需要使用可变集合,你需要显式的引入 import scala.collection.mutable.Map 类

官网详解 map api文档

val map=Map[String,Int]("a"->100,"b"->200,("c",300),("c",400))//自带去重
    println(map)
    map.foreach(println)
    val value =map.get("a")
    println(value)
    val value1 =map.get("a").get
    println(value1)
    val value2=map.get("aaa").getOrElse("no value")
    println(value2)

output:
Map(a -> 100, b -> 200, c -> 400)
(a,100)
(b,200)
(c,400)
Some(100)
100
no value

val map =Map[String,Int]("a"->100,"b"->200,("c",300))
    val keys: Iterable[String] = map.keys //获取所有key
    keys.foreach(key=>{
      val value=map.get(key).get
      println(s"key=$key,value=$value")
    })
    val map1=Map[String,Int]("a"->100,"b"->200,("d",300))
    val map2=Map[String,Int]("a"->1,"b"->2,("c",4))
    val result1=map1.++(map2) //用map2去更新map1
    val result2=map1.++:(map2)//用map1去更新map2
    println(result1)
    println(result2)

key=a,value=100
key=b,value=200
key=c,value=300
Map(a -> 1, b -> 2, d -> 300, c -> 4)
Map(a -> 100, b -> 200, c -> 4, d -> 300)

可变map

import scala.collection.mutable
    val map=mutable.Map[String,Int]()
    map.put("a",100)
    map.put("b",200)
    val result:mutable.Map[String,Int]=map.filter(tp=>{
      val key=tp._1
      val value=tp._2
      value==200
    })
    println(result)

输出:Map(b -> 200)

2.4 元组Tuple

与列表一样,元组也是不可变的,但与列表不同的是元组可以包含不同类型的元素。元组的值是通过将单个的值包含在圆括号中构成的

val tuple1: Tuple1[String] = new Tuple1("hello")
val tuple2: (String, Int) = new Tuple2("a",100)
val tuple4: (Int, Double, String, Boolean) = Tuple4(1,3.4,"abc",true)
//tuple 无法用for来遍历
val iter: Iterator[Any] = tuple4.productIterator
    iter.foreach(println)
//下标访问
val t: (Int, Int, Int, Int) = (4, 3, 2, 1)
val sum = t._1 + t._2 + t._3 + t._4
println(sum)
//swap交换
val t2 =  Tuple2("hello", "welcome")
println("交换后的元组: " + t2.swap )
//转为字符串
val t3 = new Tuple3(1, "hello", "scala")
println("连接后的字符串为: " + t3.toString() )

output:
10
交换后的元组: (welcome,hello)
连接后的字符串为: (1,hello,scala)

2.5 迭代器 Iterator

Scala Iterator(迭代器)不是一个集合,它是一种用于访问集合的方法。

迭代器 it 的两个基本操作是 next 和 hasNext。

调用 it.next() 会返回迭代器的下一个元素,并且更新迭代器的状态。

调用 it.hasNext() 用于检测集合中是否还有元素。

让迭代器 it 逐个返回所有元素最简单的方法是使用 while 循环

官方详解–>iterator api

val it = Iterator("Baidu", "Google", "Runoob", "Taobao")
    while (it.hasNext)
      println(it.next())

    val it1 = Iterator(20,40,2,50,69, 90)
    val it2 = Iterator(20,40,2,50,69, 90)
    println("最大元素是:" + it1.max )
    println("最小元素是:" + it2.min )

    val it3 = Iterator(20,40,2,50,69, 90)
    val it4 = Iterator(20,40,2,50,69, 90)
    println("ita.size 的值: " + it3.size )
    println("itb.length 的值: " + it4.length )

Baidu
Google
Runoob
Taobao
最大元素是:90
最小元素是:2
ita.size 的值: 6
itb.length 的值: 6

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值