Scala空列表的负责人

时间:2016-12-11 14:41:47

标签: scala list

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

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 )处理的。

如何修复代码?

2 个答案:

答案 0 :(得分:3)

在Scala方法中返回块的最后一个表达式。在你的情况下,你有三个表达式:两个if-expression导致unit并调用distinct,所以每次调用distinct时都会执行检查,无论列表是否为空。

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

无论如何我怀疑这段代码是否正确:你试图在'filledList'上检查一些总是空的东西

答案 1 :(得分:0)

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

另外,我明白,你只是想把这个函数写成一个练习(如果没有,只做list.distinct),但我提出,实现二次解决方案来解决平凡的线性问题从来都不是一个好的练习开头。