zoukankan      html  css  js  c++  java
  • scala 数据结构(十):折叠、扫描、拉链(合并)、迭代器

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

  • 相关阅读:
    TOMCAT清理
    tomcat 热部署、热加载 精析
    TOMCAT配置数据库连接池
    TOMCAT修改端口号
    TOMCAT配置管理员
    Go语言net/http 解读.
    《coredump问题原理探究》Linux x86版7.7节 set对象
    Asp.net与office web apps的整合
    【设计模式】代理模式实现连接池
    手把手实现Java权限(1)-Shiro介绍
  • 原文地址:https://www.cnblogs.com/qiu-hua/p/13265304.html
Copyright © 2011-2022 走看看