首页 > Java > java教程 > 正文

Java 2D数组的用户输入与90度顺时针旋转教程

霞舞
发布: 2025-10-01 14:39:11
原创
342人浏览过

Java 2D数组的用户输入与90度顺时针旋转教程

本教程详细讲解了如何在Java中实现二维数组(矩阵)的用户输入、初始化以及90度顺时针旋转。文章首先介绍了如何正确地声明、读取并显示用户定义的矩阵,解决了输入显示可能遇到的常见问题。随后,深入阐述了矩阵90度顺时针旋转的核心原理,即通过转置和行反转两步操作实现,并提供了适用于任意MN非方阵的健壮解决方案及完整的Java代码示例,最后总结了相关注意事项与最佳实践。

1. Java 2D 数组的创建与用户输入

java中创建和操作二维数组是常见的任务。本节将指导您如何通过用户输入动态定义矩阵的维度并填充其元素,同时纠正原始代码中可能导致显示异常的问题。

1.1 声明与初始化

首先,我们需要获取用户输入的行数(m)和列数(n),然后根据这些维度声明一个二维整型数组。

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();

        // 声明并初始化二维矩阵
        int[][] array = new int[m][n];

        // ... 后续操作
    }
}
登录后复制

1.2 读取矩阵元素

使用嵌套循环遍历矩阵的每一个位置,并通过 Scanner 读取用户输入的整数,将其存入对应的数组单元。

        System.out.println("请按行输入矩阵的 " + m * n + " 个元素:");
        for (int i = 0; i < m; i++) {
            for (int j = 0; j < n; j++) {
                System.out.print("请输入 array[" + i + "][" + j + "]: ");
                array[i][j] = sc.nextInt();
            }
        }
登录后复制

注意事项: 原始代码中可能存在输入后显示元素数量不符的问题,这通常是由于后续操作(如旋转)被错误地放置在显示循环内部,或者对循环逻辑的误解。确保在所有元素输入完毕后再进行显示或旋转操作,并且显示循环应完整遍历整个矩阵。

1.3 显示原始矩阵

在进行任何转换之前,通常需要显示原始矩阵,以便验证输入是否正确。

        System.out.println("\n原始矩阵:");
        displayMatrix(array); // 调用一个辅助方法显示矩阵
登录后复制
    // 辅助方法:显示矩阵
    public static void displayMatrix(int[][] matrix) {
        for (int i = 0; i < matrix.length; i++) {
            for (int j = 0; j < matrix[0].length; j++) {
                System.out.print(matrix[i][j] + "\t"); // 使用制表符对齐
            }
            System.out.println(); // 每行结束后换行
        }
    }
登录后复制

2. 矩阵90度顺时针旋转的实现

矩阵的90度顺时针旋转是一个常见的算法问题。对于非方阵(m*n),直接在原矩阵上进行旋转会比较复杂且容易出错。一种更通用且易于理解的方法是使用一个辅助矩阵来完成。

立即学习Java免费学习笔记(深入)”;

2.1 旋转原理:转置与行反转

将一个矩阵顺时针旋转90度,可以分解为两个步骤:

百度智能云·曦灵
百度智能云·曦灵

百度旗下的AI数字人平台

百度智能云·曦灵 3
查看详情 百度智能云·曦灵
  1. 转置 (Transpose): 将矩阵的行和列互换。即 matrix[i][j] 变为 matrix[j][i]。
  2. 行反转 (Reverse Rows): 对转置后的矩阵的每一行进行反转。

例如,一个2x3的矩阵:

1 2 3
4 5 6
登录后复制
  1. 转置后(变为3x2):
    1 4
    2 5
    3 6
    登录后复制
  2. 行反转后(最终结果):
    4 1
    5 2
    6 3
    登录后复制

2.2 使用辅助矩阵实现旋转

由于转置操作会改变矩阵的维度(m x n 变为 n x m),因此使用一个辅助矩阵来存储中间结果是处理非方阵的有效策略。

    /**
     * 将给定矩阵顺时针旋转90度。
     * 该方法会创建一个新的矩阵来存储旋转结果,适用于任何M*N矩阵。
     *
     * @param matrix 待旋转的原始矩阵
     * @return 旋转90度后的新矩阵
     */
    public static int[][] rotateMatrixClockwise(int[][] matrix) {
        if (matrix == null || matrix.length == 0 || matrix[0].length == 0) {
            return new int[0][0]; // 处理空矩阵或无效矩阵
        }

        int originalRows = matrix.length;
        int originalCols = matrix[0].length;

        // 旋转后的矩阵行数等于原矩阵列数,列数等于原矩阵行数
        int[][] rotatedMatrix = new int[originalCols][originalRows];

        // 第一步:转置矩阵并存储到辅助矩阵中
        // matrix[i][j] 的新位置是 rotatedMatrix[j][i]
        for (int i = 0; i < originalRows; i++) {
            for (int j = 0; j < originalCols; j++) {
                rotatedMatrix[j][i] = matrix[i][j];
            }
        }

        // 第二步:反转辅助矩阵的每一行
        // 对于 rotatedMatrix[j][i],其最终位置是 rotatedMatrix[j][originalRows - 1 - i]
        // 实际上,我们是在转置后的矩阵上进行行反转。
        // 等价于:对于原矩阵的每个元素 matrix[row][col],
        // 旋转后它会移动到新矩阵的 (col, originalRows - 1 - row) 位置。
        // 我们可以直接计算这个最终位置,避免显式的两步操作,直接填充 rotatedMatrix。
        // 但为了理解,我们先进行转置,再进行行反转。

        // 重新考虑:直接一步到位计算最终位置
        // 原 matrix[row][col] 旋转后在新矩阵的位置是 [col][originalRows - 1 - row]
        int[][] finalRotatedMatrix = new int[originalCols][originalRows];
        for (int r = 0; r < originalRows; r++) {
            for (int c = 0; c < originalCols; c++) {
                finalRotatedMatrix[c][originalRows - 1 - r] = matrix[r][c];
            }
        }
        return finalRotatedMatrix;
    }
登录后复制

解释:

  • originalRows 和 originalCols 分别是原始矩阵的行数和列数。
  • rotatedMatrix 是新的矩阵,其维度为 originalCols x originalRows。
  • 对于原始矩阵中的 matrix[r][c] 元素,它在旋转90度后会移动到新矩阵的 [c][originalRows - 1 - r] 位置。这个公式直接结合了转置和行反转的逻辑,一步到位地计算了最终位置。

3. 完整示例代码

将上述创建、输入、显示和旋转逻辑整合到一个完整的Java程序中。

import java.util.Scanner;

public class MatrixOperations {

    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);

        // 1. 获取矩阵维度
        System.out.print("请输入矩阵的行数 (m): ");
        int m = sc.nextInt();
        System.out.print("请输入矩阵的列数 (n): ");
        int n = sc.nextInt();

        // 输入验证,确保维度有效
        if (m <= 0 || n <= 0) {
            System.out.println("行数和列数必须是正整数。");
            sc.close();
            return;
        }

        // 2. 声明并初始化二维矩阵
        int[][] array = new int[m][n];

        // 3. 读取矩阵元素
        System.out.println("请按行输入矩阵的 " + (m * n) + " 个元素:");
        for (int i = 0; i < m; i++) {
            for (int j = 0; j < n; j++) {
                System.out.print("请输入 array[" + i + "][" + j + "]: ");
                array[i][j] = sc.nextInt();
            }
        }

        // 4. 显示原始矩阵
        System.out.println("\n--- 原始矩阵 ---");
        displayMatrix(array);

        // 5. 旋转矩阵
        int[][] rotatedArray = rotateMatrixClockwise(array);

        // 6. 显示旋转后的矩阵
        System.out.println("\n--- 矩阵顺时针旋转90度后 ---");
        displayMatrix(rotatedArray);

        // 关闭Scanner,释放资源
        sc.close();
    }

    /**
     * 辅助方法:显示矩阵内容
     * @param matrix 待显示的矩阵
     */
    public static void displayMatrix(int[][] matrix) {
        if (matrix == null || matrix.length == 0 || matrix[0].length == 0) {
            System.out.println("矩阵为空或无效。");
            return;
        }
        for (int i = 0; i < matrix.length; i++) {
            for (int j = 0; j < matrix[0].length; j++) {
                System.out.print(matrix[i][j] + "\t"); // 使用制表符对齐
            }
            System.out.println(); // 每行结束后换行
        }
    }

    /**
     * 将给定矩阵顺时针旋转90度。
     * 该方法会创建一个新的矩阵来存储旋转结果,适用于任何M*N矩阵。
     *
     * @param matrix 待旋转的原始矩阵
     * @return 旋转90度后的新矩阵
     */
    public static int[][] rotateMatrixClockwise(int[][] matrix) {
        if (matrix == null || matrix.length == 0 || matrix[0].length == 0) {
            return new int[0][0]; // 处理空矩阵或无效矩阵
        }

        int originalRows = matrix.length;
        int originalCols = matrix[0].length;

        // 旋转后的矩阵行数等于原矩阵列数,列数等于原矩阵行数
        int[][] finalRotatedMatrix = new int[originalCols][originalRows];

        // 计算每个元素在旋转后在新矩阵中的最终位置
        // 原 matrix[r][c] 旋转后在新矩阵的位置是 [c][originalRows - 1 - r]
        for (int r = 0; r < originalRows; r++) {
            for (int c = 0; c < originalCols; c++) {
                finalRotatedMatrix[c][originalRows - 1 - r] = matrix[r][c];
            }
        }
        return finalRotatedMatrix;
    }
}
登录后复制

4. 总结与最佳实践

  • 通用性: 上述 rotateMatrixClockwise 方法适用于任何 M x N 的矩阵,无论是方阵还是非方阵。它通过创建一个新的辅助矩阵来存储旋转结果,避免了在原矩阵上进行复杂且容易出错的就地(in-place)旋转操作。
  • 空间复杂度: 使用辅助矩阵的方法,其空间复杂度为 O(M * N),即与原始矩阵的大小相同。对于内存敏感的应用,可能需要考虑就地旋转算法(通常只适用于方阵)。
  • 输入验证: 在实际应用中,对用户输入进行验证至关重要。例如,确保矩阵的行数和列数是正整数,并处理可能的 InputMismatchException。
  • 资源管理: 及时关闭 Scanner 对象(通过 sc.close())以释放系统资源,防止资源泄露。
  • 代码清晰度: 将不同的功能(如显示、旋转)封装到单独的方法中,可以提高代码的可读性和模块化。
  • 原始问题分析: 原始代码中将 rotate(array); 和相关打印语句放在显示原始矩阵的内层循环中是错误的。旋转操作应该在矩阵完全输入并显示后,作为一次性操作执行。rotate 方法内部硬编码 M=4 也是一个主要问题,导致无法处理动态维度的矩阵。本教程的解决方案修正了这些问题。

以上就是Java 2D数组的用户输入与90度顺时针旋转教程的详细内容,更多请关注php中文网其它相关文章!

最佳 Windows 性能的顶级免费优化软件
最佳 Windows 性能的顶级免费优化软件

每个人都需要一台速度更快、更稳定的 PC。随着时间的推移,垃圾文件、旧注册表数据和不必要的后台进程会占用资源并降低性能。幸运的是,许多工具可以让 Windows 保持平稳运行。

下载
来源:php中文网
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn
最新问题
开源免费商场系统广告
热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板
关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新 English
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送
PHP中文网APP
随时随地碎片化学习

Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号