[英]Head of empty list in Scala
我在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 )处理。
如何修复代码?
在Scala方法中,返回该块的最后一个表达式。 在您的情况下,您具有三个表达式:两个if表达式会导致对unit和call的调用,因此无论列表是否为空,每次您调用distance都会执行检查。
要解决它,您可以在输入列表中使用if / else构造或模式匹配,或在headOption上进行操作。
无论如何,我怀疑这段代码是否正确:您试图检查“ filledList”上始终为空的内容
您可以通过在第二个if
之前插入else
来解决此特定错误。 但是,如另一个答案中所述,您的代码不正确,无论如何都无法正常工作,您需要重写它。
另外,据我了解,您只是想将此功能编写为练习(如果不是,请执行list.distinct
),但是我认为,对平凡线性问题实施二次求解从来都不是一个好的练习。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.