先从一道题开始看:

Eliminate consecutive duplicates of list elements.
If a list contains repeated elements they should be replaced with a single copy of the element. The order of the elements should not be changed.
Example: scala> compress(List('a, 'a, 'a, 'a, 'b, 'c, 'c, 'a, 'a, 'd, 'e, 'e, 'e, 'e))
res0: List[Symbol] = List('a, 'b, 'c, 'a, 'd, 'e)

题目的意思是,去除list中重复的元素, 并且保持其相对顺序。

看到这个题目,我的第一想法是,遍历list中的各个元素,将其放入到新的list中(如果新的list不包含该元素),最后返回新的list。

代码如下:

object Test {
def main(args: Array[String]): Unit = {
val a = List(, , , , , )
def deal[T](a:List[T]):List[T] = {
var tmp = List.empty[T]
a.map{ w=>
if(!tmp.contains(w)){
tmp = tmp :+ w
}
}
tmp
}
deal(a).foreach(println)
}
}

参考了该博客后: http://blog.thedigitalcatonline.com/blog/2015/04/07/99-scala-problems-08-eliminate-consecutive-duplicates/#.WBsNWPl97IU

使用flodLeft进行解决。代码如下:

    def compress[T](a:List[T]):List[T] = a.foldLeft(List[T]()){
case (li, e) => if (li.isEmpty || li.last != e) li:::List(e) else li
}
compress(a).foreach(println)

fold 函数解释: 该函数接收两个参数, 第一个为初始值,在上例中即为 一个空的List[T]().

第二个参数为一个函数,上例中为{}中的内容。 然后foldleft 会一次遍历list中的元素,每个元素与初始值按照处理函数的处理后,当作新的初始值,开始下一轮遍历。

在看个例子:

val a = List(, , , )

该例子中, 初始值取值为0, 遍历a中元素,初始值相加,然后作为初始值,进行下次计算。

List 中共有 fold  foldLeft 和foldRight 三个函数。 其中的差别是:

scala 学习之:List fold, foldLeft方法的更多相关文章

  1. Scala学习笔记(三)—— 方法和函数

    1. 方法 方法使用 def 定义: def 方法名(参数名:参数列表,…) :返回值类型 = { 方法结构体 } scala> def add(x : Int ,y : Int):Int = ...

  2. scala学习手记12 - 字段、方法和构造函数

    在上一节创建了一个scala类,如果没有更多的方法,scala类的定义还可以更简单一些,看一下下面这个CreditCard类的定义: class CreditCard(val number: Int, ...

  3. scala学习笔记:函数与方法

    http://stackoverflow.com/questions/2529184/difference-between-method-and-function-in-scala A Functio ...

  4. scala学习笔记4(apply方法)

    class ApplyTest{ def apply() = "This apply is in class" def test{ println("test" ...

  5. Scala:fold,foldLeft和foldRight区别与联系 reduce

    Scala:fold,foldLeft和foldRight区别与联系 我们来看看最后一个函数:reduce.使用reduce我们可以处理列表的每个元素并返回一个值.通过使用reduceLeft和red ...

  6. 【大数据】Scala学习笔记

    第 1 章 scala的概述1 1.1 学习sdala的原因 1 1.2 Scala语言诞生小故事 1 1.3 Scala 和 Java  以及 jvm 的关系分析图 2 1.4 Scala语言的特点 ...

  7. Scala学习(三)——集合

    基本数据结构 Scala提供了一些不错的集合. 数组 Array 数组是有序的,可以包含重复项,并且可变. val numbers = Array(1, 2, 3, 4, 5, 1, 2, 3, 4, ...

  8. 【Todo】【读书笔记】大数据Spark企业级实战版 & Scala学习

    下了这本<大数据Spark企业级实战版>, 另外还有一本<Spark大数据处理:技术.应用与性能优化(全)> 先看前一篇. 根据书里的前言里面,对于阅读顺序的建议.先看最后的S ...

  9. Scala学习(九)---文件和正则表达式

    文件和正则表达式 摘要: 在本篇中,你将学习如何执行常用的文件处理任务,比如从文件中读取所有行或单词,或者读取包含数字的文件等.本篇的要点包括: 1. Source.fromFile(...).get ...

随机推荐

  1. VS2013,VS2015设置类模板文件表头

    一般VS的类模板文件是放在C:\Program Files (x86)\Microsoft Visual Studio 12.0\Common7\IDE\ItemTemplatesCache\CSha ...

  2. php+mysql预查询prepare 与普通查询的性能对比

    prepare可以解决大访问量的网站给数据库服务器所带来的负载和开销,本文章通过实例向大家介绍预查询prepare与普通查询的性能对比,需要的朋友可以参考一下. 实例代码如下: <?php cl ...

  3. memset 的实现分析

    memset 是 msvcrt 中的一个函数,其作用和用途是显而易见的,通常是对一段内存进行填充,就其作用本身不具有任何歧义性.但就有人一定要纠结对数组的初始化一定要写成如下形式: int a[... ...

  4. oracle计算是否是同一周

    函数已经解决跨年问题 select to_char(date'2016-12-31','iW') from dual; select to_char(date'2017-01-01','iW') fr ...

  5. gdb 调试程序

    要调试生成的可执行程序,必须在生成的时候加入-g选项,生成可以调试的代码 例如:gcc -o test a.c b.c -g 这样gcc就会在链接的时候加入一些用于调试的符号 在生成可以调试的可执行程 ...

  6. Xcode8支持iphone4s真机调试

    由于Apple公司升级不ios到10.0以上版本,因为硬件.性能等因素,不再支持iphone4,iphone4s,ipad1, ipad2,ipad3等老款设备.所以这些老款设备无法升级到ios10. ...

  7. RabbitMQ消息机制广播分发

    public static void SendMessage() { var factory = new ConnectionFactory(); factory.HostName = "1 ...

  8. ContentProvider小结

    1.什么情况下需要使用ContentProvider 跨进程提供数据访问的接口,如果在同一个App下,没有必要使用此种方式 2.自定义ContentProvider public class MyCo ...

  9. 图片链接hover移动的解决方案分析

    现实在网站中,我们经常看到有鼠标滑过某个图片,出现边框的效果.如下图:

  10. ARM仿真器

    ARM仿真器需要将调试换成simulator,其他JLink设置不变.否则会提示无法装载.flash文件 在keil下开发的设置