1. 程式人生 > 其它 >Scala陣列函式總結以及案例

Scala陣列函式總結以及案例

技術標籤:Scalascala函式

函式大全

一、元素操作

1、+:

  • 定義:def +:(elem: A): Array[A]
  • 描述:在陣列前面新增一個元素,並返回新的陣列物件,冒號的方向指向陣列

示例:

    var a1=Array.range(1,5)
    a1.foreach(x=>print(x+"\t"))
    println()
    (12 +: a1).foreach(x=>print(x+"\t"))

在這裡插入圖片描述

2、:+

  • 定義:def :+(elem: A): Array[A]
  • 描述:在陣列後面新增一個元素,並返回新的陣列物件,冒號的方向指向陣列

示例:

    var a2 = Array("a","b","c")
    a2.foreach(x=>print(x+"\t"))
    println()
    (a2 :+ 13).foreach(x=>print(x+"\t"))

在這裡插入圖片描述

3、combinations

  • 定義:def combinations(n: Int): collection.Iterator[Array[T]]
  • 描述:選出n個元素進行排列組合,不考慮順序,並去重

示例:

    var a1=Array.range(1,5)
    a1.foreach(x=>print(x+"\t"))
    println()
    a1.combinations(3).foreach(x=>println(x.mkString("-")))

在這裡插入圖片描述

4、distinct

  • 定義:def distinct: Array[T]
  • 描述:去除當前集合中重複的元素

示例:

    var a2 = Array(1,1,2)
    a2.foreach(x=>print(x+"\t"))
    println()
    a2.distinct.foreach(x=>print(x+"\t"))

在這裡插入圖片描述

5、drop

  • 定義:def drop(n: Int): Array[T]
  • 描述:刪掉前n個元素,返回一個新陣列

示例:
刪除前n個元素

    var a2 = Array(1,1,2)
    a2.foreach(x=>print(x+"\t"))
    println()
    a2.drop(2).foreach(println)

在這裡插入圖片描述

6、dropRight

  • 定義:def dropRight(n: Int): Array[T]
  • 描述:刪掉後n個元素,返回一個新陣列

示例:
刪除後n個元素

    var a1=Array.range(1,5)
    a1.foreach(x=>print(x+"\t"))
    println()
    a1.dropRight(3).foreach(x=>print(x+"\t"))

在這裡插入圖片描述

7、dropWhile

  • 定義:
  • 描述:從第一個符合的元素開始刪除滿足條件的元素,若第一個元素就不符合條件則不做任何刪除操作

示例:

    var a1=Array.range(1,5)
    a1.foreach(x=>print(x+"\t"))
    println()
    a1.dropWhile(x=>x<3&&x>1).foreach(x=>print(x+"\t"))
    println()
    a1.dropWhile(x=>x<3&&x>=1).foreach(x=>print(x+"\t"))

8、

  • 定義:
  • 描述:

示例:

9、

  • 定義:
  • 描述:

示例:

10、

  • 定義:
  • 描述:

示例:

11、

  • 定義:
  • 描述:

示例:

12、

  • 定義:
  • 描述:

示例:

13、

  • 定義:
  • 描述:

示例:

14、

  • 定義:
  • 描述:

示例:

15、

  • 定義:
  • 描述:

示例:

16、

  • 定義:
  • 描述:

示例:

17、

  • 定義:
  • 描述:

示例:

18、

  • 定義:
  • 描述:

示例:

二、元素取頭尾

1、

  • 定義:
  • 描述:

示例:

2、

  • 定義:
  • 描述:

示例:

3、

  • 定義:
  • 描述:

示例:

4、

  • 定義:
  • 描述:

示例:

5、

  • 定義:
  • 描述:

示例:

6、

  • 定義:
  • 描述:

示例:

7、

  • 定義:
  • 描述:

示例:

8、

  • 定義:
  • 描述:

示例:

9、

  • 定義:
  • 描述:

示例:

10、

  • 定義:
  • 描述:

示例:

11、

  • 定義:
  • 描述:

示例:

三、陣列中的計算

1、/:、:\

  • 定義:def /:[B](z: B)(op: (B, T) ⇒ B): B , def :[B](z: B)(op: (T, B) ⇒ B): B
  • 描述:對陣列中所有的元素從左向右、從右向左遍歷,進行相同的迭代操作,分別為foldLeft 和foldRight 的簡寫

示例:

    var a2 = Array(1,1,2)
    a2.foreach(x=>print(x+"\t"))
    println()
    val add = (x:Int,y:Int)=>{
      var z=x+y
      println(s"$x+$y=$z")
      z
    }
    println(a2./:(0)(add))
    println(a2.:\(0)(add))

在這裡插入圖片描述

2、fold

  • 定義:def fold[A1 >: A](z: A1)(op: (A1, A1) ⇒ A1): A1ClassTag[U]): Array[U]
  • 描述:對序列中的每個元素進行二元運算,和 aggregate 有類似的語義,但執行過程有所不同

示例:
aggregate的簡化版

    var a2 = Array(1,1,2)
    a2.foreach(x=>print(x+"\t"))
    println()
    val add = (x:Int,y:Int)=>{
      var z=x+y
      println(s"$x+$y=$z")
      z
    }
    println(a2.fold(0)(add))

在這裡插入圖片描述

3、foldRight

  • 定義:foldRight[B](z: B)(op: (B, T) ⇒ B): B
  • 描述:從右到左計算

示例:

    var a2 = Array(1,1,2)
    a2.foreach(x=>print(x+"\t"))
    println()
    val add = (x:Int,y:Int)=>{
      var z=x+y
      println(s"$x+$y=$z")
      z
    }
    println(a2.foldRight(0)(add))

在這裡插入圖片描述

4、foldLeft

  • 定義:def foldLeft[B](z: B)(op: (B, T) ⇒ B): BClassTag[U]): Array[U]
  • 描述:從左到右計算

示例:

    var a2 = Array(1,1,2)
    a2.foreach(x=>print(x+"\t"))
    println()
    val add = (x:Int,y:Int)=>{
      var z=x+y
      println(s"$x+$y=$z")
      z
    }
    println("我是fold")
    println(a2.fold(0)(add))
    println("我是foldRight")
    println(a2.foldRight(0)(add))
    println("我是foldLeft")
    println(a2.foldLeft(0)(add))

在這裡插入圖片描述

5、

  • 定義:
  • 描述:

示例:

6、

  • 定義:
  • 描述:

示例:

7、

  • 定義:
  • 描述:

示例:

8、

  • 定義:
  • 描述:

示例:

9、

  • 定義:
  • 描述:

示例:

10、

  • 定義:
  • 描述:

示例:

11、

  • 定義:
  • 描述:

示例:

12、

  • 定義:
  • 描述:

示例:

13、

  • 定義:
  • 描述:

示例:

14、

  • 定義:
  • 描述:

示例:

15、

  • 定義:
  • 描述:

示例:

16、

  • 定義:
  • 描述:

示例:

四、字串相關操作

1、addString

  • 定義:def addString(b: StringBuilder): StringBuilder | def addString(b: StringBuilder, sep: String): StringBuilder | def addString(b: StringBuilder, start: String, sep: String, end: String): StringBuilder
  • 描述:將陣列中的元素逐個新增到 StringBuilder 中 | 每個元素用 sep 分隔符分開 | 在首尾各加一個字串,並指定sep分隔符

示例:

    var a2 = Array(1,1,2)
    a2.foreach(x=>print(x+"\t"))
    println()
    var a1=Array.range(1,5)
    a1.foreach(x=>print(x+"\t"))
    println()
    var builder = new StringBuilder
    a2.addString(builder," - ")
    println(builder)
    a1.addString(builder,"[",",","]")
    println(builder)
    var builder2 = new StringBuilder
    println(a1.addString(builder2, "^"): StringBuilder)

在這裡插入圖片描述

2、mkString

  • 定義:def mkString(start: String, sep: String, end: String): String
  • 描述:將序列中所有元素拼接成一個字串,以 start 開頭,以 sep 作為元素間的分隔符,以 end 結尾

示例:

    var a2 = Array(1,1,2)
    a2.foreach(x=>print(x+"\t"))
    println()
    var a1=Array.range(1,5)
    a1.foreach(x=>print(x+"\t"))
    println()
    println(a1.mkString("[", "-", "]"))
    var lst = new ArrayBuffer[Int]
    for (elem <- 1 to 5) {
      lst.append(Random.nextInt(100))
    }
    println(lst.mkString(")"))

在這裡插入圖片描述

3、

五、方法操作

1、aggregate

  • 定義:def aggregate[B](z : => B)(seqop : scala.Function2[B, A, B], combop : scala.Function2[B, B, B]) : B = { /* compiled code */ }
  • 描述:aggregate是柯里化方法(將原來接受兩個引數的函式變成新的接受一個引數的函式的過程。新的函式返回一個以原有第二個引數為引數的函式), aggregate 方法是一個聚合函式,接受多個輸入,並按照一定的規則運算以後輸出一個結果值

示例:
聚合

    val add = (x:Int,y:Int)=>{
      var z=x+y
      println(s"$x+$y=$z")
      z
    }
    var lst = new ArrayBuffer[Int]
    for (elem <- 1 to 5) {
      lst.append(Random.nextInt(100))
    }
    println(lst.par.aggregate(0)(add, add))

在這裡插入圖片描述

2、andThen

  • 定義:override def andThen[C](k : scala.Function1[B, C]) : scala.PartialFunction[A, C] = { /* compiled code */ }
  • 描述:表示方法的連續呼叫,相當於巢狀函式 a(b(x)(需要滿足第一個函式的返回值型別為第二個函式的輸入值型別),與 compose 相反

示例:
返回的結果是個偏函式,

    var a1=Array.range(1,5)
    a1.foreach(x=>print(x+"\t"))
    println()
    println(a1.andThen(x => {
      if (x % 3 == 0) {
        "match"
      }
    })(1))
    println(a1.andThen(x => {
      if (x % 3 == 0) Some(x)
      else None
    })(2))

在這裡插入圖片描述

    def add(x:Int):Int=x*2
    def mul(x:Int):Int=2+x
    def rst1 = add _ andThen (mul)
    def rst2 = add _ andThen mul _
    println(rst1(3))
    println(rst2(3))

在這裡插入圖片描述

3、compose

  • 定義:def compose[A](g : scala.Function1[A, T1]) : scala.Function1[A, R] = { /* compiled code */ }
  • 描述:表示方法的連續呼叫,與 andThen 相反

示例:

    def add(x:Int):Int=x*2
    def mul(x:Int):Int=2+x
    def rst1 = add _ compose(mul)
    def rst2 = add _ compose mul _
    println(rst1(3))
    println(rst2(3))

在這裡插入圖片描述

4、applyOrElse

  • 定義:def applyOrElse[A1 <: A, B1 >: B](x : A1, default : scala.Function1[A1, B1]) : B1 = { /* compiled code */ }
  • 描述:如果第一個呼叫的引數能匹配,返回匹配的值,否則呼叫引數二的回撥函式。

示例:

    var a1=Array.range(1,5)
    a1.foreach(x=>print(x+"\t"))
    println()
    println(a1.applyOrElse(10, { i: Int => 200 }))
    println(a1.applyOrElse(3, { i: Int => 200 }))

在這裡插入圖片描述

5、collect

  • 定義:def collect[B](pf: PartialFunction[A, B]): Array[B]
  • 描述:通過執行一個平行計算(偏函式),得到一個新的陣列物件

示例:

    var a1=Array.range(1,5)
    a1.foreach(x=>print(x+"\t"))
    println()
    a1.collect({ case i if i % 2 == 0 => i }).foreach(x=>{print(x+"\t")})

在這裡插入圖片描述

6、collectFirst

  • 定義:def collectFirst[B](pf: PartialFunction[T, B]): Option[B]
  • 描述:查詢第一個符合偏函式定義的元素,並執行偏函式計算,返回值是元組

示例:

    var a1=Array.range(1,5)
    a1.foreach(x=>print(x+"\t"))
    println()
    println(a1.collectFirst({ case i if i % 2 == 0 => i }))

在這裡插入圖片描述

7、foreach

  • 定義:def foreach(f: (A) ⇒ Unit): Unit
  • 描述:遍歷序列中的元素,進行f的操作

示例:
其他案例的輸出基本上都是foreach

8、

  • 定義:
  • 描述:

示例:

9、

  • 定義:
  • 描述:

示例:

10、

  • 定義:
  • 描述:

示例:

六、指定條件判斷

1、contains

  • 定義:def contains[A1 >: A](elem: A1): Boolean
  • 描述:判斷序列中是否包含指定物件

示例:

    var a1=Array.range(1,5)
    a1.foreach(x=>print(x+"\t"))
    println()
    println(a1.contains(5))
    println(a1.contains(3))

在這裡插入圖片描述

2、containsSlice

  • 定義:def containsSlice[B](that: GenSeq[B]): Boolean
  • 描述:判斷當前序列中是否包含另一個序列(數量和順序相等),是否包含子序列

示例:

    var a1=Array.range(1,5)
    a1.foreach(x=>print(x+"\t"))
    println()
    println(a1.containsSlice(Array(1,2)))
    println(a1.containsSlice(Array(1,3)))

在這裡插入圖片描述

3、count

  • 定義:def count(p: (T) ⇒ Boolean): Int
  • 描述:統計符合條件的元素個數

示例:

    var a1=Array.range(1,5)
    a1.foreach(x=>print(x+"\t"))
    println()
    println(a1.count(_ !=0))
    println(a1.count(_ > 1))
    println(a1.count(x => x > 3 && x < 9))

在這裡插入圖片描述

4、charAt

  • 定義:def charAt(index: Int): Char
  • 描述:獲取 index 索引處的字元,這個方法會執行一個隱式的轉換,將 Array[T] 轉換為 ArrayCharSequence,只有當 T 為 Char 型別時,這個轉換才會發生

示例:

    var a3 = Array('a','b','c','d')
    a3.foreach(x=>print(x+"\t"))
    println()
    println(a3.charAt(2))
    println(a3.charAt(3))

在這裡插入圖片描述

5、

  • 定義:
  • 描述:

示例:

6、

  • 定義:
  • 描述:

示例:

7、

  • 定義:
  • 描述:

示例:

8、

  • 定義:
  • 描述:

示例:

9、

  • 定義:
  • 描述:

示例:

10、

  • 定義:
  • 描述:

示例:

11、

  • 定義:
  • 描述:

示例:

12、

  • 定義:
  • 描述:

示例:

13、

  • 定義:
  • 描述:

示例:

14、

  • 定義:
  • 描述:

示例:

15、

  • 定義:
  • 描述:

示例:

16、

  • 定義:
  • 描述:

示例:

七、下標索引操作

1、apply

  • 定義:def apply(i: Int): T
  • 描述:獲取指定索引處的元素

示例:

    var a1=Array.range(1,5)
    a1.foreach(x=>print(x+"\t"))
    println()
    println(a1.apply(0))
    println(a1.apply(1))
    println(a1.apply(3))

在這裡插入圖片描述

2、

  • 定義:
  • 描述:

示例:

3、

  • 定義:
  • 描述:

示例:

4、

  • 定義:
  • 描述:

示例:

5、

  • 定義:
  • 描述:

示例:

6、

  • 定義:
  • 描述:

示例:

7、

  • 定義:
  • 描述:

示例:

8、

  • 定義:
  • 描述:

示例:

9、

  • 定義:
  • 描述:

示例:

10、

  • 定義:
  • 描述:

示例:

11、

  • 定義:
  • 描述:

示例:

12、

  • 定義:
  • 描述:

示例:

八、陣列拆分排序

1、

  • 定義:
  • 描述:

示例:

2、

  • 定義:
  • 描述:

示例:

3、par

  • 定義:def par: ParArray[T]
  • 描述:返回一個並行實現,產生的並行序列不能被修改,其作用相當於hashcode進行分割槽

示例:

    var lst = new ArrayBuffer[Int]
    for (elem <- 1 to 5) {
      lst.append(Random.nextInt(100))
    }
    lst.foreach(x=>print(x+"\t"))
    println()
    println(lst.par)

在這裡插入圖片描述

4、

  • 定義:
  • 描述:

示例:

5、

  • 定義:
  • 描述:

示例:

6、

  • 定義:
  • 描述:

示例:

7、

  • 定義:
  • 描述:

示例:

8、

  • 定義:
  • 描述:

示例:

9、

  • 定義:
  • 描述:

示例:

10、

  • 定義:
  • 描述:

示例:

九、陣列長度

1、

  • 定義:
  • 描述:

示例:

2、

  • 定義:
  • 描述:

示例:

3、

  • 定義:
  • 描述:

示例:

4、

  • 定義:
  • 描述:

示例:

十、兩陣列操作

1、++

  • 定義:def ++[B](that: GenTraversableOnce[B]): Array[B]
  • 描述:合併兩個集合,新陣列包含左右兩個集合的內容,如果兩個陣列型別不同,合同之後的型別為Array[Any],類似Java裡的Object型別

示例:

    var a1=Array.range(1,5)
    var a2 = Array("a","b","c")
    a1.foreach(x=>print(x+"\t"))
    println()
    a2.foreach(x=>print(x+"\t"))
    println()
    println("----++---------------")
    //++合併
    (a1++a2).foreach(x=>print(x+"\t"))

在這裡插入圖片描述

2、++:

  • 定義:def ++:[B >: A, That](that: collection.Traversable[B])(implicit bf: CanBuildFrom[Array[T], B, That]): That
  • 描述:也是兩個陣列組合起來,冒號旁邊的型別決定生成新陣列的資料型別

示例:

    var a1=Array.range(1,5)
    var a2 = Array(1.0,1,2)
    a1.foreach(x=>print(x+"\t"))
    println()
    a2.foreach(x=>print(x+"\t"))
    println()
    (a1++:a2).foreach(x=>print(x+"\t"))//x為double型別

在這裡插入圖片描述

3、canEqual

  • 定義:def canEqual(that: Any): Boolean
  • 描述:判斷兩個物件陣列是否可以進行比較,基本上都可以比較,應該不常用

示例:

    var a1=Array.range(1,5)
    a1.foreach(x=>print(x+"\t"))
    println()
    var a2 = Array("a","b","c")
    a2.foreach(x=>print(x+"\t"))
    println()
    println(a2.canEqual(a1))

在這裡插入圖片描述

4、

  • 定義:
  • 描述:

示例:

5、

  • 定義:
  • 描述:

示例:

6、diff

  • 定義:def diff(that: collection.Seq[T]): Array[T]
  • 描述:計算當前陣列與另一個數組的差集,即將當前陣列中沒有在另一個數組中出現的元素返回

示例:

    var a2 = Array(1,1,2)
    a2.foreach(x=>print(x+"\t"))
    println()
    var a1=Array.range(1,5)
    a1.foreach(x=>print(x+"\t"))
    println()
    println("-----diff--------")
    //取差集
    a1.diff(a2).foreach(println)
    println("-----intersect--------")
    //取交集
    a1.intersect(a2).foreach(println)

在這裡插入圖片描述

7、intersect

  • 定義:def intersect(that: collection.Seq[T]): Array[T]
  • 描述:返回兩個集合的交集

示例:

    var a2 = Array(1,1,2)
    a2.foreach(x=>print(x+"\t"))
    println()
    var a1=Array.range(1,5)
    a1.foreach(x=>print(x+"\t"))
    println()
    println("-----diff--------")
    //取差集
    a1.diff(a2).foreach(println)
    println("-----intersect--------")
    //取交集
    a1.intersect(a2).foreach(println)

在這裡插入圖片描述

8、sameElements

  • 定義:def sameElements(that: GenIterable[A]): Boolean
  • 描述:判斷兩個序列是否順序和對應位置上的元素都一樣,值比較

示例:

    var a1=Array.range(1,5)
    a1.foreach(x=>print(x+"\t"))
    println()
    var a3 = a1.clone()
    println(a1 == a3)
    //重寫same方法,比較值
    def same(a1:Array[Int],a2:Array[Int]):Boolean={
      var same:Boolean=true
      if (a1.size!=a2.size) {
        same = false
      }else{
        breakable{
          for (elem <- 0 until a1.size) {
            if (a1(elem)!=a2(elem)) {
              same=false
              break()
            }

          }
        }
      }
      same
    }
    println(same(a1, a3))
    println(a1.sameElements(a3))

在這裡插入圖片描述

十一、陣列克隆和複製

1、clone

  • 定義:def clone(): Array[T]
  • 描述:建立一個數組的副本,複製陣列的值,但不會引用地址;就是說是淺克隆,不是深克隆。

示例:

    var a1=Array.range(1,5)
    a1.foreach(x=>print(x+"\t"))
    println()
    var a3 = a1.clone()
    println(a1 == a3)
    println(a1.sameElements(a3))

在這裡插入圖片描述

2、copyToArray

  • 定義:def copyToArray(xs: Array[A]): Unit | def copyToArray(xs: Array[A], start: Int): Unit | def copyToArray(xs: Array[A], start: Int, len: Int): Unit
  • 描述:將當前陣列元素複製到另一個數組中,2-3的引數是待複製的陣列的起始位置和長度

示例:

    var lst2= new ArrayBuffer[Int]
    for (elem <- 1 to 6) {
      lst2.append(Random.nextInt(100))
    }
    var arr1 = Array(0,0,0,0)
    var arr2 = Array(0,0,0,0)
    var arr3 = Array(0,0,0,0)
    var arr4 = Array(0,0,0,0)
    lst2.foreach(x=>print(x+"\t"))
    println()
    lst2.copyToArray(arr1)
    lst2.copyToArray(arr2,2)
    lst2.copyToArray(arr3,0,2)
    lst2.copyToArray(arr4,1,2)
    arr1.foreach(x=>print(x+"\t"))
    println()
    arr2.foreach(x=>print(x+"\t"))
    println()
    arr3.foreach(x=>print(x+"\t"))
    println()
    arr4.foreach(x=>print(x+"\t"))

在這裡插入圖片描述

3、copyToBuffer

  • 定義:def copyToBuffer[B >: A](dest: Buffer[B]): Unit
  • 描述:將陣列中的元素複製到 Buffer 中

示例:

    var lst2= new ArrayBuffer[Int]
    for (elem <- 1 to 6) {
      lst2.append(Random.nextInt(100))
    }
    lst2.foreach(x=>print(x+"\t"))
    println()
    var buff = new ArrayBuffer[Int]
    println(buff.size)
    lst2.copyToBuffer(buff)
    println(buff.size)
    buff.foreach(x=>print(x+"\t"))

在這裡插入圖片描述

4、

  • 定義:
  • 描述:

示例:

十二、陣列反轉

1、

  • 定義:
  • 描述:

示例:

2、

  • 定義:
  • 描述:

示例:

3、

  • 定義:
  • 描述:

示例:

十三、陣列的行列操作

1、

  • 定義:
  • 描述:

示例:

2、

  • 定義:
  • 描述:

示例:

3、

  • 定義:
  • 描述:

示例:

4、

  • 定義:
  • 描述:

示例:

5、

  • 定義:
  • 描述:

示例:

6、

  • 定義:
  • 描述:

示例:

7、

  • 定義:
  • 描述:

示例:

8、

  • 定義:
  • 描述:

示例:

十四、型別轉換

1、

  • 定義:
  • 描述:

示例:

2、

  • 定義:
  • 描述:

示例:

3、

  • 定義:
  • 描述:

示例:

4、

  • 定義:
  • 描述:

示例:

5、

  • 定義:
  • 描述:

示例:

6、

  • 定義:
  • 描述:

示例:

7、

  • 定義:
  • 描述:

示例:

8、

  • 定義:
  • 描述:

示例:

9、

  • 定義:
  • 描述:

示例:

10、

  • 定義:
  • 描述:

示例:

11、

  • 定義:
  • 描述:

示例: