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
list
1
=
list++List(
21
,
22
)
println(
"list1="
+list
1
)
val
list
2
=
22
+
:
21
+
:
list
println(
"list2="
+list
2
)
val
list
3
=
list--List(
19
,
20
)
println(
"list3="
+list
3
)
val
list
4
=
list-
19
-
20
println(
"list4="
+list
4
)
val
list
5
=
list
:::
List(
21
,
22
)
println(
"list5="
+list
5
)
val
list
6
=
22
::
21
::
list
println(
"list6="
+list
6
)
val
list
7
=
list.break(
_
>
10
)
println(
"list7="
+list
7
)
val
list
8
=
list.companion(
4
,
5
)
println(
"list8="
+list
8
)
val
list
9
=
list.drop(
5
)
println(
"list9="
+list
9
)
val
list
10
=
list.dropWhile(
_
<
10
)
println(
"list10="
+list
10
)
val
list
11
=
List(
"a"
,
"b"
).mapConserve(
_
.toUpperCase())
println(
"list11="
+list
11
)
val
list
12
=
list.remove(
_%
5
==
0
)
println(
"list12="
+list
12
)
val
list
13
=
(
15
::
list).removeDuplicates
println(
"list13="
+list
13
)
val
list
14
=
list.reverse
println(
"list14="
+list
14
)
val
list
15
=
list.slice(
2
,
6
)
println(
"list15="
+list
15
)
list
1
=
List(
1
,
3
,
5
,
7
,
9
,
11
,
13
,
15
,
17
,
19
,
21
,
22
)
list
2
=
List(
22
,
21
,
1
,
3
,
5
,
7
,
9
,
11
,
13
,
15
,
17
,
19
)
list
3
=
List(
1
,
3
,
5
,
7
,
9
,
11
,
13
,
15
,
17
)
list
4
=
List(
1
,
3
,
5
,
7
,
9
,
11
,
13
,
15
,
17
)
list
5
=
List(
1
,
3
,
5
,
7
,
9
,
11
,
13
,
15
,
17
,
19
,
21
,
22
)
list
6
=
List(
22
,
21
,
1
,
3
,
5
,
7
,
9
,
11
,
13
,
15
,
17
,
19
)
list
7
=
(List(
1
,
3
,
5
,
7
,
9
),List(
11
,
13
,
15
,
17
,
19
))
list
8
=
List(
4
,
5
)
list
9
=
List(
11
,
13
,
15
,
17
,
19
)
list
10
=
List(
11
,
13
,
15
,
17
,
19
)
list
11
=
List(A, B)
list
12
=
List(
1
,
3
,
7
,
9
,
11
,
13
,
17
,
19
)
list
13
=
List(
15
,
1
,
3
,
5
,
7
,
9
,
11
,
13
,
17
,
19
)
list
14
=
List(
19
,
17
,
15
,
13
,
11
,
9
,
7
,
5
,
3
,
1
)
list
15
=
List(
5
,
7
,
9
,
11
)
val
list
16
=
list.sort((x,y)
=
>x>y)
println(
"list16="
+list
16
)
val
list
17
=
list.span(
_
<
10
)
println(
"list17="
+list
17
)
val
list
18
=
list.splitAt(
8
)
println(
"list18="
+list
18
)
val
list
19
=
list.stringPrefix
println(
"list19="
+list
19
)
val
list
20
=
list.take(
5
)
println(
"list20="
+list
20
)
val
list
21
=
list.takeRight(
5
)
println(
"list21="
+list
21
)
val
list
22
=
list.takeWhile(
_
<
15
)
println(
"list22="
+list
22
)
val
list
23
=
list.toList
println(
"list23="
+list
23
)
val
list
24
=
list.toStream
println(
"list24="
+list
24
)
val
list
25
=
list++
:
List(
21
,
22
)
println(
"list25="
+list
25
)
val
list
26
=
list./
:
(
0
)((x,y)
=
>x+y)
println(
"list26="
+list
26
)
val
list
27
=
list./
:
\(
0
)((x,y)
=
>x+y)
println(
"list27="
+list
27
)
val
list
28
=
list.
:
\(
0
)((x,y)
=
>x+y)
println(
"list28="
+list
28
)
val
list
29
=
list.
:
\(
0
)((x,y)
=
>x+y)
println(
"list29="
+list
29
)
val
list
30
=
list
:
+
20
:
+
21
println(
"list30="
+list
30
)
list
16
=
List(
19
,
17
,
15
,
13
,
11
,
9
,
7
,
5
,
3
,
1
)
list
17
=
(List(
1
,
3
,
5
,
7
,
9
),List(
11
,
13
,
15
,
17
,
19
))
list
18
=
(List(
1
,
3
,
5
,
7
,
9
,
11
,
13
,
15
),List(
17
,
19
))
list
19
=
List
list
20
=
List(
1
,
3
,
5
,
7
,
9
)
list
21
=
List(
11
,
13
,
15
,
17
,
19
)
list
22
=
List(
1
,
3
,
5
,
7
,
9
,
11
,
13
)
list
23
=
List(
1
,
3
,
5
,
7
,
9
,
11
,
13
,
15
,
17
,
19
)
list
24
=
Stream(
1
, ?)
list
25
=
List(
1
,
3
,
5
,
7
,
9
,
11
,
13
,
15
,
17
,
19
,
21
,
22
)
list
26
=
100
list
27
=
100
list
28
=
100
list
29
=
100
list
30
=
List(
1
,
3
,
5
,
7
,
9
,
11
,
13
,
15
,
17
,
19
,
20
,
21
)
val
list
31
=
list.addString(
new
StringBuilder(
"a"
))
println(
"list31="
+list
31
)
val
list
32
=
list.apply(
5
)
println(
"list32="
+list
32
)
val
list
33
=
list.canEqual(
""
)
println(
"list33="
+list
33
)
val
list
34
=
list.collect{
case
i
:
Int
=
> i+
"b"
}
println(
"list34="
+list
34
)
val
list
35
=
list.andThen(
_
<
10
).isDefinedAt(
10
)
println(
"list35="
+list
35
)
val
list
36
=
list.collectFirst{
case
i
:
Int
=
> i+
"b"
}
println(
"list36="
+list
36
)
val
list
37
=
list.take(
3
).combinations(
2
).toList
println(
"list37="
+list
37
)
val
list
38
=
list.compose(list.reverse)
println(
"list38="
+list
38
)
val
list
39
=
list.contains(
9
)
println(
"list39="
+list
39
)
val
list
40
=
list.containsSlice(List(
1
,
3
))
println(
"list40="
+list
40
)
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
list
41
=
list.corresponds(list)(
_
>
=_
)
println(
"list41="
+list
41
)
val
list
42
=
list.count(
_
<
15
)
println(
"list42="
+list
42
)
val
list
43
=
list.diff(List(
1
,
5
,
11
))
println(
"list43="
+list
43
)
val
list
44
=
list.distinct
println(
"list44="
+list
44
)
val
list
45
=
list.dropRight(
3
)
println(
"list45="
+list
45
)
list
31
=
a
135791113151719
list
32
=
11
list
33
=
true
list
34
=
List(
1
b,
3
b,
5
b,
7
b,
9
b,
11
b,
13
b,
15
b,
17
b,
19
b)
list
35
=
false
list
36
=
Some(
1
b)
list
37
=
List(List(
1
,
3
), List(
1
,
5
), List(
3
,
5
))
list
38
=
<function
1
>
list
39
=
true
list
40
=
true
array
=
1
,
3
,
5
,
7
,
9
,
11
,
13
,
15
,
17
,
19
array
=
1
,
3
,
5
,
7
,
9
,
1
,
3
,
5
,
7
,
9
array
=
1
,
1
,
3
,
5
,
9
,
1
,
3
,
5
,
7
,
9
buff
=
ListBuffer(
1
,
3
,
5
,
7
,
9
,
11
,
13
,
15
,
17
,
19
)
list
41
=
true
list
42
=
7
list
43
=
List(
3
,
7
,
9
,
13
,
15
,
17
,
19
)
list
44
=
List(
1
,
3
,
5
,
7
,
9
,
11
,
13
,
15
,
17
,
19
)
list
45
=
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 ...
随机推荐
- Codeforces325 D【并查集维护连通性】
参考:大牛blog 思路: 因为是环,所以可以复制一下图,先判断一下和他是不是和与他相邻的8个之一的一个障碍使得构成了一个环,环就是一个连通,用并查集维护即可: 如果没有就ans++,然后并把这个点加 ...
- ajax 的三种使用方法
第一种 也是最古老的一种方法之一 from 表单直接提交数据到php文件里 action为路径 <form method="post" action="./inde ...
- Unity3d与3dmax模型比例问题
1 把3dmax中1米的物体,在unity中为1厘米,所以unity中需要放大100倍才能跟3dmax中效果相同 2 unity中调整模型->inspector-scale factor可以调整 ...
- moiezen(2018.10.16)
题意:有n件行李,编号为1~n.行李的质量是模 P 意义下的(P不一定是质数).有 k 个背包,要装下这些行李,为了方便在背包中找行李,每个背包中的行李编号是连续的,允许有背包为空.我们想让最重的背包 ...
- Csc”任务不支持“SharedCompilationId”参数。请确认该参数存在于此任务中,并且是可设置的公共实例属性
今天.NetCore2.1版本,建立Asp.net Core web应用程序项目时,报以下错误: 未能使用“Csc”任务的输入参数初始化该任务. “Csc”任务不支持“SharedCompilatio ...
- 2017"百度之星"程序设计大赛 - 资格赛 度度熊的王国战略
度度熊的王国战略 度度熊国王率领着喵哈哈族的勇士,准备进攻哗啦啦族. 哗啦啦族是一个强悍的民族,里面有充满智慧的谋士,拥有无穷力量的战士. 所以这一场战争,将会十分艰难. 为了更好的进攻哗啦啦族,度度 ...
- SpringMVC-高级参数绑定
绑定数组 需求 在商品列表页面选中多个商品,然后删除. 需求分析 此功能要求商品列表页面中的每个商品前有一个checkbook,选中多个商品后点击删除按钮把商品id传递给Controller,根据商品 ...
- Unity Shader入门精要学习笔记 - 第6章 开始 Unity 中的基础光照
转自冯乐乐的<Unity Shader入门精要> 通常来讲,我们要模拟真实的光照环境来生成一张图像,需要考虑3种物理现象. 首先,光线从光源中被发射出来. 然后,光线和场景中的一些物体相交 ...
- 物体检测丨Faster R-CNN详解
这篇文章把Faster R-CNN的原理和实现阐述得非常清楚,于是我在读的时候顺便把他翻译成了中文,如果有错误的地方请大家指出. 原文:http://www.telesens.co/2018/03/1 ...
- Linux sftp用法
sftp用法 1. 用sftp如何登录服务器 sftp 是一个交互式文件传输程式.它类似于 ftp, 但它进行加密传输,比FTP有更高的安全性.下边就简单介绍一下如何远程连接主机,进行文件的上传和下载 ...