在 Dart 中,没有内建的“二维数组”类型,但你可以用 List<List<T>> 来表示。下面是你可能会遇到这个坑!!!
⚠️ 注意:慎重这样写!
final matrix = List.filled(3, List.filled(4, 0));
这会导致所有行共享同一个内部列表,修改一行会影响所有行。这么写可能不符合你的预期,会浪费你宝贵的时间和精力。
✅推荐用法
1. 固定大小的二维数组(例如 3 行 4 列,初始为 0)
void main() {
final rows = 3;
final cols = 4;
final matrix = List.generate(
rows,
(_) => List.filled(cols, 0),
);
print(matrix);
// [[0, 0, 0, 0], [0, 0, 0, 0], [0, 0, 0, 0]]
}
2. 可变大小的二维数组(可修改行列)
void main() {
List<List<int>> matrix = [];
// 添加一行
matrix.add([1, 2, 3]);
matrix.add([4, 5, 6]);
print(matrix);
// [[1, 2, 3], [4, 5, 6]]
}
3. 从用户输入或文件初始化(示例)
void main() {
final data = [
[1, 2, 3],
[4, 5, 6],
[7, 8, 9],
];
final matrix = data.map((row) => List<int>.from(row)).toList();
print(matrix[1][2]);
// 6
}
最后总结
| 场景 | 推荐写法 |
|---|---|
| 固定大小 | List.generate(rows, (_) => List.filled(cols, val)) |
| 动态添加 | List<List<T>> matrix = []; matrix.add([...]) |
| 从用户输入或文件初始化 | data.map((row) => List<int>.from(row)).toList(); |
| ⚠️ 避免共享引用 | ⚠️ 不要用 List.filled(n, sameRow) |