Scala中空列表的负责人

Head of empty list in Scala

我在 Scala 中创建了这个递归方法,它返回一个由另一个列表的所有不同元素组成的列表。

1
2
3
4
5
6
7
8
9
10
11
12
13
object es20 extends App{

    def filledList:List[Int]=List()

    @scala.annotation.tailrec
    def distinct(l:List[Int]):List[Int] ={
        if (l.isEmpty) filledList
        if (filledList.forall(_!=l.head)) l.head::filledList

    distinct(l.tail)
    }
println(distinct(List(1,1,5,6,6,3,8,3))) //Should print List(1,5,6,3,8)
}

但是,当我编译代码然后运行它时,会出现以下异常:

java.util.NoSuchElementException: 空列表头

我认为这个异常是由条件 if (l.isEmpty) 处理的。

如何修复代码?


在 Scala 中方法返回块的最后一个表达式。在您的情况下,您有三个表达式:两个 if 表达式导致单元和调用 distinct,因此每次调用 distinct 时都会执行检查,无论列表是否为空。

要修复它,您可以使用 if / else 构造,或在输入列表上进行模式匹配,或对 headOption 进行操作。

无论如何,我怀疑这段代码是否正确:您试图检查 \\'filledList\\' 上的某些内容,它始终为空


您可以通过在第二个 if 之前插入 else 来修复此特定错误。但是,正如另一个答案中提到的,您的代码不正确,并且无论如何都不会工作,您需要重写它。

另外,我理解,你只是想把这个函数写成一个练习(如果不是,就做 list.distinct),但我认为,对微不足道的线性问题实施二次解法从来都不是一个好的练习与.