Scala中元组列表处理(第三部分):自定义函数筛选偶数年龄异常排查
排查Scala自定义筛选元组列表出错的问题
嘿,作为Scala新手碰到这种问题太正常啦!先别着急,咱们一步步来拆解你可能踩的坑~
首先,我先猜一下你可能写的错误代码(毕竟返回空列表的常见原因就那几个),比如像这样:
// 模拟人员列表 val people = List(("Alice", 22), ("Bob", 23), ("Charlie", 24), ("Diana", 25)) // 错误的自定义筛选函数 def filterEvenAge(people: List[(String, Int)]): List[(String, Int)] = { people match { case Nil => Nil case head :: tail => if (head._2 % 2 == 1) filterEvenAge(tail) else filterEvenAge(tail) // 这里漏掉了把符合条件的元素加入结果! } }
最可能的两个错误点:
- 错误1:没拼接符合条件的元素:Scala的列表是不可变的,递归遍历的时候,你得把当前符合条件的元素和后续递归的结果拼接起来(用
::操作符),不然最后只会返回空列表。 - 错误2:偶数判断逻辑写反:比如把
age % 2 == 0写成了age % 2 == 1,导致把所有符合条件的元素都过滤掉了,自然返回空。
正确的自定义实现(不用内置方法)
这里给你写一个标准的递归实现,代码清晰还能解决问题:
val people = List(("Alice", 22), ("Bob", 23), ("Charlie", 24), ("Diana", 25)) def filterEvenAge(people: List[(String, Int)]): List[(String, Int)] = { people match { // 空列表直接返回空,递归终止条件 case Nil => Nil // 直接把元组拆成name和age,比用head._1/_2更易读 case (name, age) :: remainingPeople => if (age % 2 == 0) { // 符合条件:把当前元素拼接到剩余列表的筛选结果前面 (name, age) :: filterEvenAge(remainingPeople) } else { // 不符合:直接递归处理剩余列表 filterEvenAge(remainingPeople) } } } // 测试一下,输出应该是 List((Alice,22), (Charlie,24)) println(filterEvenAge(people))
额外提醒:如果用循环实现的话
要是你习惯用循环而不是递归,也要记得主动把符合条件的元素添加到结果列表里,比如:
def filterEvenAgeLoop(people: List[(String, Int)]): List[(String, Int)] = { var result = List.empty[(String, Int)] for ((name, age) <- people) { if (age % 2 == 0) { // 用::拼接效率更高,不过要注意顺序,或者用:+(尾插效率低但顺序一致) result = (name, age) :: result } } // 如果用::的话,最后要反转一下保证顺序和原列表一致 result.reverse }
这样就能得到正确的结果啦~
内容的提问来源于stack exchange,提问作者Yuva
相关产品推荐
相关产品推荐

