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

Posted qiu-hua

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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 方法变量

 

以上是关于scala 数据结构:折叠扫描拉链(合并)迭代器的主要内容,如果未能解决你的问题,请参考以下文章

Scala集合中的函数(扩展)

Scala:如何在循环中合并数据帧

如何将折叠左侧运算符“:/”转换为scala中的foldLeft函数?

团购快结束保温杯,折叠浴桶,湿巾,scala清洁用品

使用 scala 使用布尔运算折叠火花数据框中的列

大数据(7i)比较Python和Scala的collection常用方法