Scala获取列表倒数第二个元素函数实现问题求助
解决方案
先梳理你现有代码的问题:
- 第二个case
case list +: Nil匹配单元素列表并返回Some(list),但测试要求单元素列表返回None,这直接不符合需求。 - 第一个case重复使用参数名
list作为变量名,容易造成混淆,虽然语法合法但可读性差。
下面提供几种符合要求的正确实现:
方式一:模式匹配(直观清晰)
通过模式匹配直接匹配长度≥2的列表,提取倒数第二个元素,其余情况返回None:
def penultimate(list: List[Int]): Option[Int] = list match { case _ :+ penult :+ _ => Some(penult) case _ => None }
方式二:List API 实现(简洁高效)
利用dropRight(1)移除列表最后一个元素,再通过lastOption获取剩余列表的最后一个元素(即原列表的倒数第二个),若剩余列表为空(原列表长度≤1)则自动返回None:
def penultimate(list: List[Int]): Option[Int] = list.dropRight(1).lastOption
方式三:明确边界处理
拆分空列表、单元素列表、长列表三种情况,逻辑更明确:
def penultimate(list: List[Int]): Option[Int] = list match { case Nil => None case _ :: Nil => None case xs => Some(xs.init.last) }
以上三种实现均满足测试要求:空列表List()和单元素列表List(5)返回None,长度≥2的列表返回倒数第二个元素的Some包装值。
内容的提问来源于stack exchange,提问作者Borja Alamo
相关产品推荐
相关产品推荐

