scala 數據結構(十):摺疊、掃描、拉鍊(合併)、迭代器

1 摺疊

fold函數將上一步返回的值做爲函數的第一個參數繼續傳遞參與運算,直到list中的全部元素被遍歷。函數

1)能夠把reduceLeft看作簡化版的foldLeft。學習

如何理解:spa

def reduceLeft[B >: A](@deprecatedName('f) op: (B, A) => B): B =code

  if (isEmpty) throw new UnsupportedOperationException("empty.reduceLeft")blog

  else tail.foldLeft[B](head)(op)ip

你們能夠看到. reduceLeft就是調用的foldLeft[B](head),而且是默認從集合的head元素開始操做的。開發

2)相關函數:fold,foldLeft,foldRight,能夠參考reduce的相關方法理解it

foldLeft和foldRight 縮寫方法分別是:/:和:\io

val list4 = List(1, 9, 2, 8)
def minus(num1: Int, num2: Int): Int = {
num1 - num2
}
var i6 = (1 /: list4) (minus) // =等價=> list4.foldLeft(1)(minus)
println(i6) // 輸出?
i6 = (100 /: list4) (minus)
println(i6) // 輸出?
i6 = (list4 :\ 10) (minus) // list4.foldRight(10)(minus)
println(i6) // 輸出?

2 掃描

掃描,即對某個集合的全部元素作fold操做,可是會把產生的全部中間結果放置於一個集合中保存class

應用實例

def minus( num1 : Int, num2 : Int ) : Int = {
num1 - num2
}
//5 (1,2,3,4,5) =>(5,4,2,-1,-5,-10)
val i8 = (1 to 5).scanLeft(5)(minus) //IndexedSeq[Int]
println(i8)
def add( num1 : Int, num2 : Int ) : Int = {
num1 + num2
}
//5 (1,2,3,4,5) =>(5,6,8, 11,15,20)
val i9 = (1 to 5).scanLeft(5)(add) //IndexedSeq[Int]
println(i9)

3 拉鍊(合併)

在開發中,當咱們須要將兩個集合進行 對偶元組合併,可使用拉鍊。

// 拉鍊
val list1 = List(1, 2 ,3)
val list2 = List(4, 5, 6)

val list3 = list1.zip(list2) // (1,4),(2,5),(3,6)
println("list3=" + list3)

注意事項

1)拉鍊的本質就是兩個集合的合併操做,合併後每一個元素是一個 對偶元組

2)操做的規則下圖:

 

 3)若是兩個集合個數不對應,會形成數據丟失。

4)集合不限於List, 也能夠是其它集合好比 Array

5)若是要取出合併後的各個對偶元組的數據,能夠遍歷

 

 4 迭代器

經過iterator方法從集合得到一個迭代器,經過while循環和for表達式對集合進行遍歷.(學習使用迭代器來遍歷)

應用案例

val iterator = List(1, 2, 3, 4, 5).iterator // 獲得迭代器
    println("--------遍歷方式1 -----------------")
    while (iterator.hasNext) {
        println(iterator.next())
    }
    println("--------遍歷方式2 for -----------------")
    for(enum <- iterator) {
      println(enum) //
    }

應用案例小結

1)  iterator 的構建實際是 AbstractIterator 的一個匿名子類,該子類提供了
    /*
     def iterator: Iterator[A] = new AbstractIterator[A] {
    var these = self
    def hasNext: Boolean = !these.isEmpty
    def next(): A =
    */

2)該AbstractIterator 子類提供了 hasNext next 等方法.

3)所以,咱們可使用 while的方式,使用hasNext next 方法變量

相關文章
相關標籤/搜索