多重循环的格式及注意事项

5 阅读2分钟

在 Scala 中,多重循环(嵌套循环)的格式与单循环类似,通过将一个循环结构嵌套在另一个循环结构内部实现,常用于处理多维数据或需要多层遍历的场景。

多重循环的基本格式

1. 嵌套 for 循环

for 循环在 Scala 中语法简洁,支持多生成器(generator),天然适合实现多重循环,无需显式嵌套大括号。

格式 1:多生成器在同一行(推荐)

for (
  变量1 <- 集合1;  // 外层循环
  变量2 <- 集合2   // 内层循环(依赖外层变量时,顺序不能换)
) {
  // 循环体(可使用变量1、变量2)
}

格式 2:显式嵌套(类似其他语言)

for (变量1 <- 集合1) {  // 外层循环
  for (变量2 <- 集合2) {  // 内层循环
    // 循环体
  }
}
2. 嵌套 while 循环
var 外层变量 = 初始值
while (外层条件) {
  var 内层变量 = 初始值
  while (内层条件) {
    // 循环体
    内层变量 = 更新值  // 避免死循环
  }
  外层变量 = 更新值  // 避免死循环
}

注意事项

  1. 循环变量作用域

    • for 循环的变量(如 i、j)作用域仅限于循环体,外层变量可在内层使用,但内层变量无法在外层访问。
    • while 循环的变量需用 var 声明(可变变量),作用域可能超出循环体(需注意变量污染)。
  2. 性能问题

    • 多重循环的时间复杂度通常为 O(n^k) (k 为循环层数),层数越多性能消耗越大,避免不必要的嵌套(如可通过扁平化集合、使用高阶函数 flatMap 替代)。
  3. 退出循环的方式

    • Scala 中没有 break 语句(需导入 scala.util.control.Breaks 工具类),多层循环中使用 break 需注意标签(label)区分层级:

      import scala.util.control.Breaks._
      
      breakable {  // 外层循环标签
        for (i <- 1 to 5) {
          breakable {  // 内层循环标签
            for (j <- 1 to 5) {
              if (i == 3 && j == 3) break()  // 退出内层循环
              println(s"i=$i, j=$j")
            }
          }
          if (i == 4) break()  // 退出外层循环
        }
      }
      
  4. 可读性

    • 循环层数建议不超过 3 层,过多层级会导致代码难以维护,可拆分为函数或使用集合操作(如 flatMap、foreach 嵌套)优化。
  5. for 循环的守卫(条件过滤) 可在多生成器中添加守卫(if 条件)简化逻辑,避免内层循环中的条件判断