0

0

Java二维数组用户输入与90度顺时针旋转教程

DDD

DDD

发布时间:2025-10-01 11:47:01

|

422人浏览过

|

来源于php中文网

原创

Java二维数组用户输入与90度顺时针旋转教程

本教程详细讲解了如何在Java中实现二维数组(矩阵)的用户输入、遍历显示以及90度顺时针旋转。文章首先阐述了通过Scanner类动态创建和填充矩阵的方法,随后深入探讨了矩阵旋转的数学原理,并提供了一个针对任意m x n矩阵的健壮旋转算法实现,旨在帮助开发者避免常见错误并掌握高效的矩阵操作技巧。

理解二维数组的创建与用户输入

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 < m 和 j < n),这样才能确保所有m * n个元素都被正确读取。如果用户反馈只显示了少量元素,很可能是输入循环或显示循环逻辑有误,导致未能完全遍历。

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

代码解析:

  1. rotateMatrix90DegreesClockwise 方法接收一个int[][]类型的originalMatrix作为参数。
  2. 首先进行空值和维度检查,确保矩阵有效。
  3. 获取原始矩阵的行数m和列数n。
  4. 创建一个新的rotatedMatrix,其维度为n行m列,这是旋转后的正确尺寸。
  5. 使用两层嵌套循环遍历originalMatrix的每一个元素。
  6. 在循环内部,根据旋转原理 rotatedMatrix[j][m - 1 - i] = originalMatrix[i][j] 将原始元素放置到新矩阵的相应位置。
  7. 最后返回rotatedMatrix。

注意事项与最佳实践

  • 避免硬编码尺寸: 原始问题中的static int M = 4;会导致旋转逻辑只能用于特定大小的矩阵。在实际开发中,应始终使用matrix.length和matrix[0].length来动态获取矩阵的尺寸。
  • 非方阵的处理: 上述旋转算法能够正确处理任何m x n的矩阵,包括方阵和非方阵。旋转后,矩阵的行数和列数会互换。
  • 空间复杂度: 这种使用辅助矩阵的旋转方法,其空间复杂度为O(m*n),因为需要创建一个与原始矩阵大小相近的新矩阵。对于某些内存受限的场景,可能需要考虑原地旋转算法(但通常仅限于方阵)。
  • 时间复杂度: 遍历所有元素一次进行复制和转换,时间复杂度为O(m*n)。
  • 输入验证: 在实际应用中,应增加对用户输入行数和列数的验证,例如确保它们是正整数,以避免创建零维或负维度的数组导致程序崩溃。
  • 错误处理: 对于rotateMatrix90DegreesClockwise方法,如果传入null或空矩阵,应该有适当的错误处理或返回机制。

总结

本教程详细介绍了如何在Java中处理二维数组的用户输入、显示以及90度顺时针旋转。通过理解矩阵旋转的数学映射关系,并结合动态尺寸处理和辅助矩阵的方法,我们可以实现一个健壮且通用的旋转功能。掌握这些基本操作对于进行更复杂的矩阵运算和图形处理至关重要。始终记住,良好的编程实践包括动态尺寸处理、清晰的逻辑和适当的错误处理。

热门AI工具

更多
DeepSeek
DeepSeek

幻方量化公司旗下的开源大模型平台

豆包大模型
豆包大模型

字节跳动自主研发的一系列大型语言模型

WorkBuddy
WorkBuddy

腾讯云推出的AI原生桌面智能体工作台

腾讯元宝
腾讯元宝

腾讯混元平台推出的AI助手

文心一言
文心一言

文心一言是百度开发的AI聊天机器人,通过对话可以生成各种形式的内容。

讯飞写作
讯飞写作

基于讯飞星火大模型的AI写作工具,可以快速生成新闻稿件、品宣文案、工作总结、心得体会等各种文文稿

即梦AI
即梦AI

一站式AI创作平台,免费AI图片和视频生成。

ChatGPT
ChatGPT

最最强大的AI聊天机器人程序,ChatGPT不单是聊天机器人,还能进行撰写邮件、视频脚本、文案、翻译、代码等任务。

相关专题

更多
c语言中null和NULL的区别
c语言中null和NULL的区别

c语言中null和NULL的区别是:null是C语言中的一个宏定义,通常用来表示一个空指针,可以用于初始化指针变量,或者在条件语句中判断指针是否为空;NULL是C语言中的一个预定义常量,通常用来表示一个空值,用于表示一个空的指针、空的指针数组或者空的结构体指针。

254

2023.09.22

java中null的用法
java中null的用法

在Java中,null表示一个引用类型的变量不指向任何对象。可以将null赋值给任何引用类型的变量,包括类、接口、数组、字符串等。想了解更多null的相关内容,可以阅读本专题下面的文章。

1089

2024.03.01

string转int
string转int

在编程中,我们经常会遇到需要将字符串(str)转换为整数(int)的情况。这可能是因为我们需要对字符串进行数值计算,或者需要将用户输入的字符串转换为整数进行处理。php中文网给大家带来了相关的教程以及文章,欢迎大家前来学习阅读。

1031

2023.08.02

int占多少字节
int占多少字节

int占4个字节,意味着一个int变量可以存储范围在-2,147,483,648到2,147,483,647之间的整数值,在某些情况下也可能是2个字节或8个字节,int是一种常用的数据类型,用于表示整数,需要根据具体情况选择合适的数据类型,以确保程序的正确性和性能。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

614

2024.08.29

c++怎么把double转成int
c++怎么把double转成int

本专题整合了 c++ double相关教程,阅读专题下面的文章了解更多详细内容。

334

2025.08.29

C++中int的含义
C++中int的含义

本专题整合了C++中int相关内容,阅读专题下面的文章了解更多详细内容。

235

2025.08.29

length函数用法
length函数用法

length函数用于返回指定字符串的字符数或字节数。可以用于计算字符串的长度,以便在查询和处理字符串数据时进行操作和判断。 需要注意的是length函数计算的是字符串的字符数,而不是字节数。对于多字节字符集,一个字符可能由多个字节组成。因此,length函数在计算字符串长度时会将多字节字符作为一个字符来计算。更多关于length函数的用法,大家可以阅读本专题下面的文章。

954

2023.09.19

页面置换算法
页面置换算法

页面置换算法是操作系统中用来决定在内存中哪些页面应该被换出以便为新的页面提供空间的算法。本专题为大家提供页面置换算法的相关文章,大家可以免费体验。

500

2023.08.14

TypeScript类型系统进阶与大型前端项目实践
TypeScript类型系统进阶与大型前端项目实践

本专题围绕 TypeScript 在大型前端项目中的应用展开,深入讲解类型系统设计与工程化开发方法。内容包括泛型与高级类型、类型推断机制、声明文件编写、模块化结构设计以及代码规范管理。通过真实项目案例分析,帮助开发者构建类型安全、结构清晰、易维护的前端工程体系,提高团队协作效率与代码质量。

26

2026.03.13

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
Kotlin 教程
Kotlin 教程

共23课时 | 4.4万人学习

C# 教程
C# 教程

共94课时 | 11.3万人学习

Java 教程
Java 教程

共578课时 | 81.9万人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

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