鱼C论坛

 找回密码
 立即注册
查看: 1368|回复: 3

java 数组越界问题

[复制链接]
发表于 2023-11-2 20:10:20 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
本帖最后由 忆北 于 2023-11-2 20:39 编辑

public class ArrayDemo7 {
    public static void main(String[] args) {
       // 创建一个11*11的二维数组
        int[][] array = new int[11][11];
        array[1][2] = 1;
        array[2][3] = 2;

        // 转换为稀疏数组保存
        // 获取有效值个数

        int number = 0;
        for (int i = 0; i < array.length; i++) {
            for (int j = 0; j < array.length; j++) {
                if(array
[j]!=0){
                    number++;
                }
            }
        }
        System.out.println(number);

        
[i]// 创建一个稀疏数组
        int[][] array1 = new int[number+1][3];
        array1[0][0] = 11;
        array1[0][1] = 11;
        array1[0][2] = number;

       // 遍历二维数组,将非零值,存放到稀疏数组里
        int count = 0;
        for (int i = 0; i < array.length;i++) {
            for (int j = 0; j < array.length; j++) {
                if (array
[i][j]!=0){
                    count++;
                    array1[count][0] = i;
                    array1[count][1] = j;
                    array1[count][2] = array
[i][j];
                }
            }
        
}
        // 输出稀疏数组
       System.out.println("输出稀疏数组");
        for (int i = 0; i < array1.length; i++) {
            System.out.println(array1
[i][0]+"\t"+array1[i][1]+"\t"+array1[i][2]);
        }

        // 还原
        int[][] array2 = new int[array1[0][0]][array1[0][1]];

        for (int i = 0; i < array1.length; i++) {                     
把这个i=0变成i=1就好了      

            array2[array[i]
[i][i][0]][array[i][i][i][1]] = array1[2];         这一行他说数组越界了,为什么等于0就越界了啊,我以为等于0后,就是第11行11列等于2了,但是直接会报错了,我知道这样不好看,但是不知道怎么发了,有知道的大佬请求帮助一下。
        }
        for (int[] ints:array2) {
            for(int anint : ints){
                System.out.print(anint+"\t");
            }
            System.out.println();
        }
    }
}

[/i][/i][/i][/i][/i][/i][/i][/i][/i][/i]
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2023-11-2 20:10:49 | 显示全部楼层
问题出在这一行代码上:

array2[array1[0]][array1[1]] = array1[2];

在这里,你试图将稀疏数组array1中的值还原到二维数组array2中。但是,你在这里使用了array1[0]和array1[1]作为索引,这是错误的。

array1[0]表示稀疏数组的行数,而array1[1]表示稀疏数组的列数。你应该使用array1[ i][0]和array1[ i][1]作为索引来访问稀疏数组中的行和列。

正确的代码应该是这样的:

array2[array1[ i][0]][array1[ i][1]] = array1[ i][2];

这样,你就可以正确地将稀疏数组中的值还原到二维数组中了。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2023-11-2 20:11:35 | 显示全部楼层
问题:在还原稀疏数组时,数组越界错误。具体来说,在循环中,当数组元素等于0时,将值存储在array2中时出现了问题。

解决方法:
1. 循环时应该使用稀疏数组的行数进行迭代,而不是数组的长度。因为稀疏数组的第一行包含数组的行数、列数和非零元素个数。
2. 在还原数组时,应该使用稀疏数组中的列和值来索引array2数组,并将值放入此索引处。

以下是修改后的代码:

public class ArrayDemo7 {
    public static void main(String[] args) {
        // 创建一个11*11的二维数组
        int[][] array = new int[11][11];
        array[1][2] = 1;
        array[2][3] = 2;
        // 转换为稀疏数组保存
        // 获取有效值个数
        int number = 0;
        for (int i = 0; i < array.length; i++) {
            for (int j = 0; j < array.length; j++) {
                if (array[i][j] != 0) { // 修正了判断条件
                    number++;
                }
            }
        }
        System.out.println(number);
        // 创建一个稀疏数组
        int[][] array1 = new int[number + 1][3];
        array1[0][0] = 11;
        array1[0][1] = 11;
        array1[0][2] = number;
        // 遍历二维数组,将非零值,存放到稀疏数组里
        int count = 0;
        for (int i = 0; i < array.length; i++) {
            for (int j = 0; j < array.length; j++) {
                if (array[i][j] != 0) { // 修正了判断条件
                    count++;
                    array1[count][0] = i;
                    array1[count][1] = j;
                    array1[count][2] = array[i][j]; // 修正了赋值
                }
            }
        }
        // 输出稀疏数组
        System.out.println("输出稀疏数组");
        for (int[] row : array1) {
            System.out.println(row[0] + "\t" + row[1] + "\t" + row[2]);
        }
        // 还原
        int[][] array2 = new int[array1[0][0]][array1[0][1]];
        for (int i = 1; i < array1.length; i++) {
            array2[array1[i][0]][array1[i][1]] = array1[i][2];
        }
        for (int[] row : array2) {
            for (int val : row) {
                System.out.print(val + "\t");
            }
            System.out.println();
        }
    }
}

希望这可以帮助你解决问题!

球一个最佳答案谢谢啦!这对我非常重要!
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2023-11-2 20:43:00 | 显示全部楼层
isdkz 发表于 2023-11-2 20:10
问题出在这一行代码上:

array2[array1[0]][array1[1]] = array1[2];

我是写的array[i][0] 不知道为啥他显示不了呢,我就是不知道这一行上面那个循环i为啥不能等于0啊
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-12-23 04:38

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表