You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.19 08:30:47