
理解二维数组的创建与用户输入
在java中,二维数组本质上是数组的数组。我们可以根据用户输入动态地定义其行数和列数,并填充数组元素。
1. 声明二维数组
首先,我们需要获取用户期望的行数和列数,然后使用这些值来声明一个二维数组。
import java.util.Scanner;
public class MatrixOperations {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
System.out.print("请输入矩阵的行数 (m): ");
int m = sc.nextInt();
System.out.print("请输入矩阵的列数 (n): ");
int n = sc.nextInt();
// 声明一个m行n列的二维数组
int[][] originalMatrix = new int[m][n];
// ... 后续输入和操作
}
}2. 通过Scanner获取用户输入
使用嵌套循环遍历二维数组的每一个位置,并通过Scanner读取用户输入的整数值。
System.out.println("请输入矩阵的元素 (共 " + (m * n) + " 个): ");
for (int i = 0; i < m; i++) {
for (int j = 0; j < n; j++) {
System.out.print("请输入元素 [" + i + "][" + j + "]: ");
originalMatrix[i][j] = sc.nextInt();
}
}注意事项: 确保内层循环和外层循环的条件正确 (i
3. 显示数组内容
同样使用嵌套循环来遍历并打印数组的每一个元素。为了使输出更具可读性,每打印完一行后换行。
立即学习“Java免费学习笔记(深入)”;
public static void printMatrix(int[][] matrix) {
if (matrix == null || matrix.length == 0 || matrix[0].length == 0) {
System.out.println("矩阵为空或维度不合法。");
return;
}
System.out.println("矩阵内容如下:");
for (int i = 0; i < matrix.length; i++) {
for (int j = 0; j < matrix[i].length; j++) {
System.out.print(matrix[i][j] + "\t"); // 使用制表符分隔,保持对齐
}
System.out.println(); // 每行结束后换行
}
}二维矩阵90度顺时针旋转原理
将一个m行n列的矩阵originalMatrix进行90度顺时针旋转,会得到一个n行m列的新矩阵rotatedMatrix。
其核心映射关系如下: 如果原始矩阵中的元素位于 (i, j)(即第 i 行,第 j 列),那么在旋转后的矩阵中,它将移动到 (j, m - 1 - i)。
- i 是原始矩阵的行索引,范围从 0 到 m-1。
- j 是原始矩阵的列索引,范围从 0 到 n-1。
- m 是原始矩阵的总行数。
因此,originalMatrix[i][j] 会被放置到 rotatedMatrix[j][m - 1 - i]。
由于旋转后的矩阵维度发生了变化(从m x n变为n x m),我们通常需要创建一个新的辅助矩阵来存储旋转结果,而不是在原地进行旋转(原地旋转对于方阵来说是可能的,但对于非方阵则更为复杂且不直观)。
实现矩阵90度顺时针旋转
根据上述原理,我们可以编写一个rotate方法来执行矩阵旋转。
public class MatrixOperations {
// ... (main方法和printMatrix方法)
/**
* 将给定的矩阵顺时针旋转90度。
* @param originalMatrix 原始矩阵 (m行n列)
* @return 旋转后的新矩阵 (n行m列)
*/
public static int[][] rotateMatrix90DegreesClockwise(int[][] originalMatrix) {
if (originalMatrix == null || originalMatrix.length == 0 || originalMatrix[0].length == 0) {
System.out.println("无法旋转空矩阵或维度不合法的矩阵。");
return new int[0][0]; // 返回一个空矩阵
}
int m = originalMatrix.length; // 原始矩阵的行数
int n = originalMatrix[0].length; // 原始矩阵的列数
// 创建一个新的矩阵来存储旋转结果,新矩阵的维度是 n行m列
int[][] rotatedMatrix = new int[n][m];
// 遍历原始矩阵的每一个元素,并将其放置到旋转后矩阵的正确位置
for (int i = 0; i < m; i++) { // 遍历原始矩阵的行
for (int j = 0; j < n; j++) { // 遍历原始矩阵的列
// 原始矩阵的 (i, j) 元素移动到新矩阵的 (j, m - 1 - i) 位置
rotatedMatrix[j][m - 1 - i] = originalMatrix[i][j];
}
}
return rotatedMatrix;
}
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
System.out.print("请输入矩阵的行数 (m): ");
int m = sc.nextInt();
System.out.print("请输入矩阵的列数 (n): ");
int n = sc.nextInt();
int[][] originalMatrix = new int[m][n];
System.out.println("请输入矩阵的元素 (共 " + (m * n) + " 个): ");
for (int i = 0; i < m; i++) {
for (int j = 0; j < n; j++) {
System.out.print("请输入元素 [" + i + "][" + j + "]: ");
originalMatrix[i][j] = sc.nextInt();
}
}
System.out.println("\n--- 原始矩阵 ---");
printMatrix(originalMatrix);
// 调用旋转方法
int[][] rotatedMatrix = rotateMatrix90DegreesClockwise(originalMatrix);
System.out.println("\n--- 旋转90度顺时针后的矩阵 ---");
printMatrix(rotatedMatrix);
sc.close();
}
}代码解析:
- rotateMatrix90DegreesClockwise 方法接收一个int[][]类型的originalMatrix作为参数。
- 首先进行空值和维度检查,确保矩阵有效。
- 获取原始矩阵的行数m和列数n。
- 创建一个新的rotatedMatrix,其维度为n行m列,这是旋转后的正确尺寸。
- 使用两层嵌套循环遍历originalMatrix的每一个元素。
- 在循环内部,根据旋转原理 rotatedMatrix[j][m - 1 - i] = originalMatrix[i][j] 将原始元素放置到新矩阵的相应位置。
- 最后返回rotatedMatrix。
注意事项与最佳实践
- 避免硬编码尺寸: 原始问题中的static int M = 4;会导致旋转逻辑只能用于特定大小的矩阵。在实际开发中,应始终使用matrix.length和matrix[0].length来动态获取矩阵的尺寸。
- 非方阵的处理: 上述旋转算法能够正确处理任何m x n的矩阵,包括方阵和非方阵。旋转后,矩阵的行数和列数会互换。
- 空间复杂度: 这种使用辅助矩阵的旋转方法,其空间复杂度为O(m*n),因为需要创建一个与原始矩阵大小相近的新矩阵。对于某些内存受限的场景,可能需要考虑原地旋转算法(但通常仅限于方阵)。
- 时间复杂度: 遍历所有元素一次进行复制和转换,时间复杂度为O(m*n)。
- 输入验证: 在实际应用中,应增加对用户输入行数和列数的验证,例如确保它们是正整数,以避免创建零维或负维度的数组导致程序崩溃。
- 错误处理: 对于rotateMatrix90DegreesClockwise方法,如果传入null或空矩阵,应该有适当的错误处理或返回机制。
总结
本教程详细介绍了如何在Java中处理二维数组的用户输入、显示以及90度顺时针旋转。通过理解矩阵旋转的数学映射关系,并结合动态尺寸处理和辅助矩阵的方法,我们可以实现一个健壮且通用的旋转功能。掌握这些基本操作对于进行更复杂的矩阵运算和图形处理至关重要。始终记住,良好的编程实践包括动态尺寸处理、清晰的逻辑和适当的错误处理。










