def insert[A](xs: List[A], extra: List[A])(p: A => Boolean) = {
xs.map(x => if (p(x)) extra ::: List(x) else List(x)).flatten
}
scala> insert(List(4,1,2,3,4),List(88,99)){_ == 4}
res3: List[Int] = List(88, 99, 4, 1, 2, 3, 88, 99, 4)
编辑:添加了解释。
我们的目标是插入一个列表(称为extra
)位于另一个列表中选定元素的前面(此处称为xs
--常用于列表,就好像一件事是x
那么 much 一定是复数xs
)。我们希望它适用于我们可能拥有的任何类型的列表,因此我们使用通用类型对其进行注释[A]
.
哪些元素是插入的候选元素?在编写函数时,我们不知道,因此我们提供一个函数来表示每个元素的 true 或 false (p: A => Boolean
).
现在,对于列表中的每个元素x
,我们检查——我们是否应该进行插入(即是p(x)
真的)?如果是,我们就构建它:extra ::: List(x)
只是以下的元素extra
接下来是单个项目x
。 (最好写成extra :+ x
--在最后添加单个项目。)如果没有,我们只有单个项目,但我们会制作它List(x)
而不仅仅是x
因为我们希望所有东西都具有相同的类型。所以现在,如果我们有类似的东西
4 1 2 3 4
我们的条件是插入5 6
before 4
,我们生成
List(5 6 4) List(1) List(2) List(3) List(5 6 4)
这正是我们想要的,只不过我们有一个列表列表。为了摆脱内部列表并将所有内容扁平化为一个列表,我们只需调用flatten
.