Scala 的list
9.1 使用列表
列表类型:跟数组一样,列表也是同质化的(homogeneous)。即所有元素都要是同种类型。
列表结构:所有列表由两部分组成:Nil 和 ::(cons)。
基本操作:主要有三个:head , tail , isEmpty 。这些都定义在List Object里。head 和 tail只能用在非空列表里。可以用“插入排序”的例子来进行说明。
模式匹配:::在Scala标准库里是一个case class 。所以可以使用用模式匹配
9.2 List类的定义
List是一个抽象类。List里定义了很多方法,解释如下:
分解列表。
啮合(zipping lists):把两个List结合成一个列表对,如,有列表:xs = List(X1 , ... Xn) 和 ys = List(y1 , ... , yn) , xs zip ys,则生成List对:List((X1 , Y1), ... (Xn , Yn))
操作列表:跟其他中缀操作符一样,::实现为一个对象的方法。Scala里以“:”结尾的操作符都被当成右操作符,也就是从右往左运算。
连接列表:“:::”操作符可以用来连接两个列表。
反转列表:另一个有用的操作就是反转(reversal)。给出了一种reverse方法的实现,但是这种方法跟List的长度成正比,不是很有效。之后会给出一种只有线性关系的实现。
def reverse[A](xs : List[A]) : List[A] = xs match{
case Nil => Nil
case x :: xs => reverse(xs) ::: List(x)
}
9.3 例子:归并排序(merge sort)
之前的插入排序(insertion sort)虽然简单,但不是很有效。平均复杂度与输入列表的长度的平方成正比。一个比插入排序更好的算法是“归并排序”。工作原理如下:
一,如果这个List有0个或者1个元素,那么它是已经排好的,可以直接返回这个列表。稍长的列表可以分成两部分,每部分包含大概原List一半的长度内容。每个子列表被一个递归的排序调用进行排序,然后两个排序好的列表被一个合并操作合并在一起。
对于一个归并排序的实现,我们仍然要指定元素类型,同时也要有用来做比较(comparison)的函数,用来确定排序规则。一个实现如下:
def msort[A](less: (A, A) => Boolean)(xs: List[A]): List[A] = {
def merge(xs1: List[A], xs2: List[A]): List[A] =
if (xs1.isEmpty) xs2
else if (xs2.isEmpty) xs1
else if (less(xs1.head, xs2.head)) xs1.head :: merge(xs1.tail, xs2)
else xs2.head :: merge(xs1, xs2.tail)
val n = xs.length / 2
if (n == 0) xs
else merge(msort(less)(xs.take(n)), msort(less)(xs.drop(n)))
}
msort的定义用到了柯里化,所以可以这样使用:
val intSort = msort((x : Int , y : Int) => x < y)
val reverseSort = msort((x : Int , y : Int) => x > y
val list=List(1 to 20 by 2:_*)val list1=list++List(21,22)println("list1="+list1)val list2=22+:21+:listprintln("list2="+list2)val list3=list--List(19,20)println("list3="+list3)val list4=list-19-20println("list4="+list4)val list5=list:::List(21,22)println("list5="+list5)val list6=22::21::listprintln("list6="+list6)val list7=list.break(_>10)println("list7="+list7)val list8=list.companion(4,5)println("list8="+list8)val list9=list.drop(5)println("list9="+list9)val list10=list.dropWhile(_<10)println("list10="+list10)val list11=List("a","b").mapConserve(_.toUpperCase())println("list11="+list11)val list12=list.remove(_%5==0)println("list12="+list12)val list13=(15::list).removeDuplicatesprintln("list13="+list13)val list14=list.reverseprintln("list14="+list14)val list15=list.slice(2,6)println("list15="+list15)list1=List(1, 3, 5, 7, 9, 11, 13, 15, 17, 19, 21, 22)list2=List(22, 21, 1, 3, 5, 7, 9, 11, 13, 15, 17, 19)list3=List(1, 3, 5, 7, 9, 11, 13, 15, 17)list4=List(1, 3, 5, 7, 9, 11, 13, 15, 17)list5=List(1, 3, 5, 7, 9, 11, 13, 15, 17, 19, 21, 22)list6=List(22, 21, 1, 3, 5, 7, 9, 11, 13, 15, 17, 19)list7=(List(1, 3, 5, 7, 9),List(11, 13, 15, 17, 19))list8=List(4, 5)list9=List(11, 13, 15, 17, 19)list10=List(11, 13, 15, 17, 19)list11=List(A, B)list12=List(1, 3, 7, 9, 11, 13, 17, 19)list13=List(15, 1, 3, 5, 7, 9, 11, 13, 17, 19)list14=List(19, 17, 15, 13, 11, 9, 7, 5, 3, 1)list15=List(5, 7, 9, 11)val list16=list.sort((x,y)=>x>y)println("list16="+list16)val list17=list.span(_<10)println("list17="+list17)val list18=list.splitAt(8)println("list18="+list18)val list19=list.stringPrefixprintln("list19="+list19)val list20=list.take(5)println("list20="+list20)val list21=list.takeRight(5)println("list21="+list21)val list22=list.takeWhile(_<15)println("list22="+list22)val list23=list.toListprintln("list23="+list23)val list24=list.toStreamprintln("list24="+list24)val list25=list++:List(21,22)println("list25="+list25)val list26=list./:(0)((x,y)=>x+y)println("list26="+list26)val list27=list./:\(0)((x,y)=>x+y)println("list27="+list27) val list28=list.:\(0)((x,y)=>x+y)println("list28="+list28)val list29=list.:\(0)((x,y)=>x+y)println("list29="+list29)val list30=list:+20:+21println("list30="+list30)list16=List(19, 17, 15, 13, 11, 9, 7, 5, 3, 1)list17=(List(1, 3, 5, 7, 9),List(11, 13, 15, 17, 19))list18=(List(1, 3, 5, 7, 9, 11, 13, 15),List(17, 19))list19=Listlist20=List(1, 3, 5, 7, 9)list21=List(11, 13, 15, 17, 19)list22=List(1, 3, 5, 7, 9, 11, 13)list23=List(1, 3, 5, 7, 9, 11, 13, 15, 17, 19)list24=Stream(1, ?)list25=List(1, 3, 5, 7, 9, 11, 13, 15, 17, 19, 21, 22)list26=100list27=100list28=100list29=100list30=List(1, 3, 5, 7, 9, 11, 13, 15, 17, 19, 20, 21)val list31=list.addString(new StringBuilder("a"))println("list31="+list31)val list32=list.apply(5)println("list32="+list32)val list33=list.canEqual("")println("list33="+list33)val list34=list.collect{case i:Int => i+"b"}println("list34="+list34)val list35=list.andThen(_<10).isDefinedAt(10)println("list35="+list35)val list36=list.collectFirst{case i:Int => i+"b"}println("list36="+list36)val list37=list.take(3).combinations(2).toListprintln("list37="+list37)val list38=list.compose(list.reverse)println("list38="+list38)val list39=list.contains(9)println("list39="+list39)val list40=list.containsSlice(List(1,3))println("list40="+list40)val array=new Array[Int](10)list.copyToArray(array)println("array="+array.mkString(","))list.copyToArray(array,5)println("array="+array.mkString(","))list.copyToArray(array,1,3)println("array="+array.mkString(","))val buff=new ListBuffer[Int]();list.copyToBuffer(buff)println("buff="+buff)val list41=list.corresponds(list)(_>=_)println("list41="+list41)val list42=list.count(_<15)println("list42="+list42)val list43=list.diff(List(1,5,11))println("list43="+list43)val list44=list.distinctprintln("list44="+list44)val list45=list.dropRight(3)println("list45="+list45)list31=a135791113151719list32=11list33=truelist34=List(1b, 3b, 5b, 7b, 9b, 11b, 13b, 15b, 17b, 19b)list35=falselist36=Some(1b)list37=List(List(1, 3), List(1, 5), List(3, 5))list38=<function1>list39=truelist40=truearray=1,3,5,7,9,11,13,15,17,19array=1,3,5,7,9,1,3,5,7,9array=1,1,3,5,9,1,3,5,7,9buff=ListBuffer(1, 3, 5, 7, 9, 11, 13, 15, 17, 19)list41=truelist42=7list43=List(3, 7, 9, 13, 15, 17, 19)list44=List(1, 3, 5, 7, 9, 11, 13, 15, 17, 19)list45=List(1, 3, 5, 7, 9, 11, 13)Scala 的list的更多相关文章
- jdb调试scala代码的简单介绍
在linux调试C/C++的代码需要通过gdb,调试java代码呢?那就需要用到jdb工具了.关于jdb的用法在网上大家都可以找到相应的文章,但是对scala进行调试的就比较少了.其实调试的大致流程都 ...
- scala练习题1 基础知识
1, 在scala REPL中输入3. 然后按下tab键,有哪些方法可以被调用? 24个方法可以被调用, 8个基本类型: 基本的操作符, 等: 2,在scala REPL中,计算3的平方根,然 ...
- 牛顿法求平方根 scala
你任说1个整数x,我任猜它的平方根为y,如果不对或精度不够准确,那我令y = (y+x/y)/2.如此循环反复下去,y就会无限逼近x的平方根.scala代码牛顿智商太高了println( sqr(10 ...
- Scala集合和Java集合对应转换关系
作者:Syn良子 出处:http://www.cnblogs.com/cssdongl 转载请注明出处 用Scala编码的时候,经常会遇到scala集合和Java集合互相转换的case,特意mark一 ...
- Scala化规则引擎
1. 引言 什么是规则引擎 一个业务规则包含一组条件和在此条件下执行的操作,它们表示业务规则应用程序的一段业务逻辑.业务规则通常应该由业务分析人员和策略管理者开发和修改,但有些复杂的业务规则也可以由技 ...
- Scala快速概览
IDEA工具安装及scala基本操作 目录 一. 1. 2. 3. 4. 二. 1. 2. 3. 三. 1. 2. 3. 4. 5. 6. 7. 四. 1. (1) (2) (3) (4) (5) ( ...
- Scala Macros - scalamela 1.x,inline-meta annotations
在上期讨论中我们介绍了Scala Macros,它可以说是工具库编程人员不可或缺的编程手段,可以实现编译器在编译源代码时对源代码进行的修改.扩展和替换,如此可以对用户屏蔽工具库复杂的内部细节,使他们可 ...
- Scala Macros - 元编程 Metaprogramming with Def Macros
Scala Macros对scala函数库编程人员来说是一项不可或缺的编程工具,可以通过它来解决一些用普通编程或者类层次编程(type level programming)都无法解决的问题,这是因为S ...
- Scala Reflection - Mirrors,ClassTag,TypeTag and WeakTypeTag
反射reflection是程序对自身的检查.验证甚至代码修改功能.反射可以通过它的Reify功能来实时自动构建生成静态的Scala实例如:类(class).方法(method).表达式(express ...
- Scala For Java的一些参考
变量 String yourPast = "Good Java Programmer"; val yourPast : String = "Good Java ...
随机推荐
- crontab计划任务监控nginx服务器
#!/bin/bash ps axu |grep 'nginx' |grep -v 'grep' &>/dev/null ] then echo "准备重启nginx....& ...
- Spring Boot 学习系列(04)—分而治之,多module打包
此文已由作者易国强授权网易云社区发布. 欢迎访问网易云社区,了解更多网易技术产品运营经验. 明确功能,各司其职 在一个结构清晰的项目中,一个没有module划分的结构显然不是最佳实践.有人会说可以在同 ...
- 洛谷 - P2283 - 多边形 - 半平面交
https://www.luogu.org/problemnew/show/P2283 需要注意max是求解顺序是从右到左,最好保证安全每次都清空就没问题了. #include<bits/std ...
- Swift3.0 Set
set的简单的使用方法 //创建一个空set var letters = Set<Character>() //数组字面量创建set,只能存放string var setColors:Se ...
- uoj#276. 【清华集训2016】汽水(分数规划+点分治)
传送门 没想到点分治那一层-- 首先不难发现这是个分数规划,先把所有的边长减去\(k\),二分答案,设为\(mid\),就是要求路径平均值\(ans\in[-mid,mid]\) 先来考虑\(ans\ ...
- SpringBoot2.0基础案例(01):环境搭建和RestFul风格接口
一.SpringBoot 框架的特点 1.SpringBoot2.0 特点 1)SpringBoot继承了Spring优秀的基因,上手难度小 2)简化配置,提供各种默认配置来简化项目配置 3)内嵌式容 ...
- excel输入值非法,限定了可以输入的数值怎么办
回到excel的编辑界面,点击工具栏的“数据”标签,如图所示. 继续在“数据”标签的下面找到“数据验证”或“数据有效性”的按钮,点击该选项,然后继续下一步. 在弹出的选择框中选择“数据验证”选项,如图 ...
- Linux | C代码的编写、运行和调试
1. 建立.c文件 在终端下输入:vi mytest.c [使用编辑器 vim] 键入键盘i键,使vi编辑器进入编辑模式 接下来在vi编译器中编写代码,如: #include <stdio.h ...
- [題解]luogu_P2055假期的宿舍(二分圖最大匹配)
雖然是裸題但是仍然沒有看出來...... 1.每個人都對應一張床(可以的話),這樣把人和床看成點,對應關係就是邊,跑最大匹配看匹配數量夠不夠即可 2.連邊條件:如果一個學生且不回家,那麼他可以睡自己的 ...
- [软件工程基础]2017.11.03 第七次 Scrum 会议
具体事项 项目交接燃尽图 每人工作内容 成员 已完成的工作 计划完成的工作 工作中遇到的困难 游心 #10 搭建可用的开发测试环境:#9 阅读分析 PhyLab 后端代码与文档:#8 掌握 Larav ...