这是一种使用递归的方法。我试图以一种最容易解释的方式来阐述它:
import scala.annotation.tailrec
@tailrec
def getIndividuals(in: List[Int], out: List[Int] = List.empty): List[Int] = {
if(in.isEmpty) out
else if(!out.contains(in.head)) getIndividuals(in.tail, out :+ in.head)
else getIndividuals(in.tail, out)
}
val list = List(1, 2, 3, 4, 5, 4, 3, 5, 6, 0, 7)
val list2 = List(1)
val list3 = List()
val list4 = List(3, 3, 3, 3)
getIndividuals(list) // List(1, 2, 3, 4, 5, 6, 0, 7)
getIndividuals(list2) // List(1)
getIndividuals(list3) // List()
getIndividuals(list4) // List(3)
这个函数接受两个参数,in 和out,并遍历in 列表中的每个元素,直到它为空(通过使用in 的tail 调用自身)。一旦in 为空,函数就会输出out 列表。
如果 out 列表不包含您当前正在查看的 in 的值,则该函数使用 in 的尾部调用自身,并将 in 的值添加到末尾out 列表。
如果out 确实包含您当前正在查看的in 的值,它只会使用in 的尾部和当前的out 列表调用自身。
注意:这是 Arnon 提出的 fold 方法的替代方法。我个人会编写一个像我这样的函数,然后在必要时将其重构为 fold 函数。我自然不会以一种功能性的、fold-y 的方式思考,所以像这样布置它有助于我在试图找出逻辑时想象正在发生的事情。