java二维数组转换需按目标分类型处理:转置须确保维度匹配并正确初始化;降维采用顺序展平;转list增强动态性;稀疏压缩适用于大量零值场景。

Java 中二维数组的数据转换不是单一操作,而是按目标分类型处理:转置(行列互换)、降维(转一维)、结构映射(转 List 或字符串)、稀疏压缩(节省空间)等。选哪种方式,取决于你手头数据的形态和后续用途。
二维数组转置:确保尺寸匹配再赋值
转置本质是把 原数组第 i 行第 j 列 的元素,放到 新数组第 j 行第 i 列。关键不在循环写法,而在维度初始化是否正确:
- 若原数组是
int[m][n](m 行 n 列),转置后必须声明为new int[n][m],不能反着写 - 空数组要提前判空:
if (arr == null || arr.length == 0 || arr[0] == null),否则运行时抛NullPointerException - 不规则数组(如
{{1,2}, {3,4,5}})数学上无定义;如需兼容,得先统一每行长度(补零或截断),但这已不属于标准转置 - 核心赋值语句只能是
transposed[j][i] = original[i][j];写成transposed[i][j] = original[j][i]是常见索引错位错误
二维数组转一维数组:顺序展平最常用
适合需要线性遍历、排序或传给某些 API 的场景。逻辑简单,但要注意索引计算:
- 目标一维数组长度 =
original.length * original[0].length(前提是规则矩阵) - 用单变量
index累加,每取一个元素就存入oneD[index++] - 遍历顺序默认是“先行后列”,即 row0-col0, row0-col1…row1-col0…,符合内存连续性
- 若需“先列后行”(列优先),则外层循环应遍历列,内层遍历行
二维数组转 List 结构:增强泛型与动态性
当需要增删、迭代、流式处理时,List> 比原始数组更灵活:
- 外层
List<list>></list>存行,每行是一个独立的ArrayList<integer></integer> - 避免直接用
Arrays.asList()包装原始行——它返回的是固定大小的 List,且对基本类型不友好 - 若原始数组含 null 行,需跳过或单独处理,防止
NullPointerException - Stream 写法更简洁:
Arrays.stream(arr).map(row -> Arrays.stream(row).boxed().collect(Collectors.toList())).collect(Collectors.toList())
二维数组与稀疏数组互转:专用于大量零值场景
典型用于棋盘、地图等稀疏数据,能大幅减少存储占用:
- 二维 → 稀疏:首行存
[总行数, 总列数, 非零个数],后续每行存[行索引, 列索引, 值] - 稀疏 → 二维:先读首行创建目标数组,再逐行读取坐标和值,直接赋值
arr[row][col] = value - 判断是否值得转稀疏:非零元素占比远低于 5%(例如 11×11 棋盘仅存 3 个棋子)
- 注意稀疏数组本身也是二维数组,只是固定为
(n+1) × 3形状,n是非零元素数量
不复杂但容易忽略细节。实际编码前,先明确你要的是“换位置”“压平结构”“增强操作”还是“压缩存储”,再选对应路径。
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











