scala中的reduceLeft,reduceRight,foldLeft,foldRight方法
来源:互联网 发布:建站影响以后的优化吗 编辑:程序博客网 时间:2024/05/16 02:46
scala中集合类iterator特质的化简和折叠方法
c.reduceLeft(op)这样的调用将op相继应用到元素,如:
eg:
val a = List(1,7,2,9) val a1 = a.reduceLeft(_ - _)// ((1-7) - 2) - 9 = -17
c.foldLeft(0)(_ * _)方法
val a2 = a.foldLeft(0)(_ - _) // 0-1-7-2-9 = -19
对于foldLeft方法还有一种简写,这种写法的本意是让你通过/:来联想一棵树的样子
对/:操作符来说,初始值是第一个操作元本题中是0,:后是第二个操作元a
val a3 = (0 /: a)(_ - _) // 等价于a.foldLeft(0)(_ - _)
scala同样也提供了foldRight或:\的变体,计算
val a4 = a.foldRight(0)(_ - _)// 1-(7-(2-(9-0))) = -13 val a5 = (a :\ 0)(_ - _) // 等价于a.foldRight(0)(_ - _)
好像上面的方法都没什么用,但折叠fold有时候可以代替循环,例如:
统计每个字母中字符串出现的次数
val frep = collection.mutable.Map[Char,Int]() // 使用可变集合// 使用for循环来统计次数 for(c <- "Mississippi") frep(c) = frep.getOrElse(c, 0)+1// 使用/: foldLeft()()来统计次数 val result = (Map[Char,Int]() /: "Mississippi"){ (m,c) => m + (c -> (m.getOrElse(c, 0)+1)) }// 任何while循环都可用fold来代替 println(frep,result) //(Map(M -> 1, s -> 4, p -> 2, i -> 4),Map(M -> 1, i -> 4, s -> 4, p -> 2))
这是使用fold的步骤:在每一步,将频率映射和新遇到的字母结合在一起,产生一个新的频率映射。这就是折叠:
fold的初始值和操作符是分开定义的柯里化参数,这样scala就可以呀根据类型来推断操作符的类型定义。
eg:该函数的初始值是String,因此操作符的类型应该是(String,Int) => String的函数
val a7 = a.foldLeft("")(_ + _) val a8 = a.foldRight("")(_+_) val a9 = a.fold(0)(_+_) println(a7,a8,a9) // (1729,1729,19)
阅读全文
1 0
- scala中的reduceLeft,reduceRight,foldLeft,foldRight方法
- Scala的foldLeft和foldRight
- Scala的foldLeft和foldRight
- Scala的foldLeft和foldRight
- Scala: foldLeft和foldRight 实战
- Scala :foldLeft foldRight min max
- scala里面的foldLeft和foldRight
- scala基础38-foldLeft/foldRight/sortWith
- scala学习之:List的foldLeft、foldRight操作实战
- scala-37::List的foldLeft、foldRight、sort操作代码实战
- Scala:fold,foldLeft和foldRight区别与联系
- Scala:fold,foldLeft和foldRight区别与联系
- Scala:fold,foldLeft和foldRight区别与联系
- scala ReduceLeft
- Scala reduceLeft
- Scala深入浅出实战经典:37,List的foldLeft、foldRight、sort操作代码实战
- javascript 中的reduce方法 和 reduceRight方法
- fold/foldLeft/foldRight区别和联系
- jieba(结巴)分词种词性简介
- string类学习字符串中的子串出现次数与替换的问题
- POJ2676 DFS
- ASp.net判断文件或文件夹是否存在
- 经验分享 |【PDF下载】双11技术峰会之面对双11的前端“极限挑战”
- scala中的reduceLeft,reduceRight,foldLeft,foldRight方法
- Android-onCreate与virtual function
- LRUCache算法的简单实现
- slf4j的包使用说明
- Android进阶封装之一个类实现兼容Android 6.0权限、适配Android7.0 拍照: 相机与相册上传图片就用我好啦!
- atoi()函数的实现
- SQLServer
- Lucene学习笔记(一)
- 代理模式