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

scala 数据结构(十):折叠、扫描、拉链(合并)、迭代器

时间:2020-07-08 10:30:25      阅读:89      评论:0      收藏:0      [点我收藏+]

标签:div   返回   ati   nbsp   默认   boolean   iter   The   迭代   

1 折叠

fold函数将上一步返回的值作为函数的第一个参数继续传递参与运算,直到list中的所有元素被遍历。

1)可以把reduceLeft看做简化版的foldLeft。

如何理解:

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

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

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

大家可以看到. reduceLeft就是调用的foldLeft[B](head),并且是默认从集合的head元素开始操作的。

2)相关函数:fold,foldLeft,foldRight,可以参考reduce的相关方法理解

foldLeft和foldRight 缩写方法分别是:/:和:\

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操作,但是会把产生的所有中间结果放置于一个集合中保存

应用实例

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 方法变量

 

scala 数据结构(十):折叠、扫描、拉链(合并)、迭代器

标签:div   返回   ati   nbsp   默认   boolean   iter   The   迭代   

原文地址:https://www.cnblogs.com/qiu-hua/p/13265304.html

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