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 数据结构:折叠扫描拉链(合并)迭代器的主要内容,如果未能解决你的问题,请参考以下文章