2301_78343468 2024-03-29 19:09 采纳率: 45.5%
浏览 4
已结题

java二维数组打印问题

img

img


java打印如图三角形,我不是直接通过for循环把二维数组的元素长度挨个定义再赋值。我写的是:先不定义二维数组元素长度,通过for循环定义一维数组,然后再把一维数组的地址直接一一对应赋给二维数组对应的元素。编译的时候没问题,但运行的时候显示如图问题说超出长度了。

  • 写回答

2条回答 默认 最新

  • 专家-赤兔[在线] 全栈领域优质创作者 2024-03-29 19:09
    关注

    引自免费微信小程序:皆我百晓生

    在Java中,如果你想要动态创建一个二维数组并逐行打印其中的元素,但是编译和运行时都会出现ArrayIndexOutOfBoundsException异常,那么以下是一种可能的解决方案:

    import java.util.Scanner;
    import java.util.Arrays;
    
    public class Dynamic二维ArrayPrint {
    
        public static void main(String[] args) {
            Scanner scanner = new Scanner(System.in);
            System.out.println("Enter the dimensions of the first row:");
            int rows = scanner.nextInt();
            System.out.println("Enter the dimensions of the second row:");
            int cols = scanner.nextInt();
    
            int[][] array = new int[rows][cols];
    
            // Fill the first row with some values
            for (int i = 0; i < rows; i++) {
                array[i] = new int[]{i, i + 1};
            }
    
            // Print each element in the row
            for (int i = 0; i < rows; i++) {
                for (int j = 0; j < cols; j++) {
                    printElement(array, i, j);
                }
            }
    
            scanner.close();
        }
    
        private static void printElement(int[][] array, int index, int row) {
            if (row >= array.length || row <= 0 || index >= array[row].length) {
                throw new ArrayIndexOutOfBoundsException("Index out of bounds for length " + array[row].length);
            }
    
            System.out.print(array[index][row]);
        }
    }
    

    在这个例子中,我们首先从用户那里获取两个整数 rowscols,表示二维数组的行数和列数。然后,我们创建了一个大小为 rows * colsint 数组 array

    接下来,我们分别填充了第一行的 array,使用嵌套的两层 for 循环遍历每一行。对于每行中的每一个位置 index, 我们调用了 printElement 函数,这个函数接受三个参数:arrayindexrowprintElement 函数接收这些参数后,首先检查当前的行 row 是否大于等于 array 的长度,小于等于零,或者索引 index 是否大于或等于 array 的元素数量。如果是,则抛出一个 ArrayIndexOutOfBoundsException 异常,因为此时索引 index 确实已经超出了 array 的长度。

    最后,我们打印了数组的每一项,即每个位置上的元素。

    注意:printElement 函数没有提供直接根据长度动态初始化数组的实现。在上述代码中,我们只是简单地为每一行的第一个位置指定了一些初始值,但这并不是一种常用的动态数组初始化策略,因为它可能导致程序运行时出现问题,特别是在输入尺寸较小的情况下。

    另外,如果你需要将数组的元素顺序重新排列,可以在 printElement 函数中添加一个排序操作,例如按照元素的索引进行升序排序。以下是修改后的版本:

    private static void printElement(int[][] array, int index, int row) {
        if (row >= array.length || row <= 0 || index >= array[row].length) {
            throw new ArrayIndexOutOfBoundsException("Index out of bounds for length " + array[row].length);
        }
    
        if (index == 0) {
            printElementsInRow(array, row, 0, 0, 0);
            return;
        }
    
        System.arraycopy(array, index, array, row, (array[row].length - index) / 2);
    
        if (row < array.length - 1 && index < array[row + 1].length) {
            printElement(array, index + 1, row + 1);
        } else if (row > 0 && index < array[row - 1].length) {
            printElement(array, index, row - 1);
        } else {
            System.out.print(array[index][row]);
        }
    }
    
    private static void printElementsInRow(int[][] array, int row, int start, int end, int mid) {
        for (int i = start; i <= end; i++) {
            System.out.print(array[i][mid]);
        }
    }
    

    在这个版本中,我们在 printElement 函数中增加了两个额外的逻辑分支:

    1. 如果索引是 0,则打印前几行,因为它们已经是有序的。
    2. 如果索引不是 0,我们需要递归地调用 printElementsInRow 函数,对索引值加 1 后再次访问相应行。这是因为我们的目标是从第一行开始向前移动,而不需要考虑整个数组。

    这样,当我们要输出二维数组中的所有元素时,我们可以通过递归地调整printElement函数的边界条件来确保输出的元素正确地排列顺序。

    评论 编辑记录

报告相同问题?

问题事件

  • 已结题 (查看结题原因) 3月29日
  • 创建了问题 3月29日

悬赏问题

  • ¥15 python运行报错 ModuleNotFoundError: No module named 'torch'
  • ¥100 华为手机私有App后台保活
  • ¥15 sqlserver中加密的密码字段查询问题
  • ¥20 有谁能看看我coe文件到底哪儿有问题吗?
  • ¥20 我的这个coe文件到底哪儿出问题了
  • ¥15 matlab使用自定义函数时一直报错输入参数过多
  • ¥15 设计一个温度闭环控制系统
  • ¥100 rtmpose姿态评估
  • ¥15 通联支付网上收银统一下单接口
  • ¥15 angular有偿编写,