在 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 (内层条件) {
// 循环体
内层变量 = 更新值 // 避免死循环
}
外层变量 = 更新值 // 避免死循环
}
注意事项
-
循环变量作用域
- for 循环的变量(如 i、j)作用域仅限于循环体,外层变量可在内层使用,但内层变量无法在外层访问。
- while 循环的变量需用 var 声明(可变变量),作用域可能超出循环体(需注意变量污染)。
-
性能问题
- 多重循环的时间复杂度通常为 O(n^k) (k 为循环层数),层数越多性能消耗越大,避免不必要的嵌套(如可通过扁平化集合、使用高阶函数 flatMap 替代)。
-
退出循环的方式
-
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() // 退出外层循环 } }
-
-
可读性
- 循环层数建议不超过 3 层,过多层级会导致代码难以维护,可拆分为函数或使用集合操作(如
flatMap、foreach 嵌套)优化。
- 循环层数建议不超过 3 层,过多层级会导致代码难以维护,可拆分为函数或使用集合操作(如
-
for 循环的守卫(条件过滤) 可在多生成器中添加守卫(
if条件)简化逻辑,避免内层循环中的条件判断