酸奶的Java学习日记 | 二维数组篇

前情提要

众所周知,数组,尤其是二维数组的索引是个令人着迷的小家伙,它经常把人迷的晕头转向,为了不再当史上无敌大迷糊,今天势必把索引与数组长度搞清楚。

索引 从0开始 (一定一定要记住是从0开始)

数组长度 正常数数,从一开始计数(应该没有哪个迷糊虫说自己吃了0个苹果吧Σ( ° △ °|||)︴ )

检测数组长度可以用Java中的length方法

int arr[]=new int [5];

这里的5就指的是数组长度。

例题

下面来几道我这个小白写了2个半小时写出来的题(实在是一言难尽……bug的生产者在此)

利用随机函数产生16个随机数,给一个4*4的二维数组赋值
按行列输出数组
求最外一圈元素之和
求主对角线中最大元素的值及其位置

利用随机函数产生16个随机数,给一个4*4的二维数组赋值

//        1.利用随机函数产生16个随机数,给一个4*4的二维数组赋值
        int array[][]=new int[4][4];
//        已知array.length=4

        Random r=new Random();
        for (int i=0;i<array.length;i++){
            for (int j=0;j<array[i].length;j++){
                int num = r.nextInt(100);
                array[i][j]=num;
            }
        }

1.这里已知数组长度,所以行和列可以都写上去

2.利用随机数随机产生数的特性,将数值范围设定到0~100,也就是
int num =r.nextInt(100);

3.利用循环,给每一个数组元素赋值

4.把二维数组看成是一个特殊的一维数组,array[i].length的含义也就显而易见了,它表示的是array数组第i行共有几列,也就是第i行共有多少个元素(是数组长度哦)

按行列输出数组

//        2.按行列输出数组
        for (int i=0;i<array.length;i++){
            for (int j=0;j<array[i].length;j++){
                System.out.print(array[i][j]+"\t");
            }
            System.out.println();
        }

这一步只需要双层for循环逐行输出即可,内层for循环结束代表一行输出完毕,需要在外层for循环执行换行操作。

\t 就相当于键盘上的Tab制表键,简洁美观 (u‿ฺu✿ฺ)

求最外一圈元素之和

初步设想
这个就上升难度了,首先来分析一下,一个一个元素加肯定是可以的,毕竟元素少嘛,就16个,抛去中间4个,简简单单呐~

但是,写代码不仅仅是为了解决眼下的问题,更是要体现出代码的特点——复用性。

所以挨个相加不是很好的样子……不行,咱换一个嘛。

我一开始是动了让所有元素相加到最后减去不需要元素的心思,毕竟减4个比加一整个外圈简单,考虑到复用性,我放弃了……

不就是外圈相加嘛,who怕who!!!
再步设想
外圈相加,也就是找到所有外圈元素所在位置的规律,这样问题就轻而易举解决了!

我为了找规律,还专门为此创作了一张惊天地泣鬼神的神作,如图所示……


呐,就是它,根据这张图,可以发现它的行和列都是有规律的在变化,我只需要写四个for循环把两行两列的所有数据加上就大功告成了!

所以我写出了漏洞百出的代码 (⊙﹏⊙)

以下代码块中行注释是解释说明步骤,块注释全是错代码,经过我仔细研究,仔细拿计算器相加(无意间暴露了什么),终于……发现问题出在哪了!

//        3.求最外一圈元素之和
//        3.1 求第一行的和 i不变 j变
        int sum=0;
//        array.length--4
//        array[0].length-1--3
       for (int j=0;j<array[0].length-1;j++){
            sum+=array[0][j];
        }

        /*int sum=0;
        for (int i=0;i<array.length;i++){
            for (int j=0;j<array[i].length;j++){
                sum+=array[0][j];
            }
        }*/

//        3.2 求第一列的和 j不变 i变
        for (int i=1;i<array.length;i++){
            sum+=array[i][0];
        }
        /*for (int i=0;i<array.length;i++){
            for (int j=0;j<array[i].length;j++){
                sum+=array[i][0];
            }
        }*/
//        3.3 求第四行的和 i不变 j变
//        array.length-1--3
//        array[array.length-1].length---4
        for (int j=1;j<array[array.length-1].length;j++){
            sum+=array[array.length-1][j];
        }
        /*for (int i=0;i<array.length;i++){
            for (int j=0;j<array[i].length;j++){
                sum+=array[array.length-1][j];
            }
        }*/
//        3.4 求第四列的和 j不变 i变
//        array.length--4
//        array.length-1--3
       for (int i=0;i<array.length-1;i++){
            sum+=array[i][array.length-1];
        }
       /* for (int i=0;i<array.length;i++){
            for (int j=0;j<array[i].length;j++){
                sum4+=array[i][array.length-1];
            }
        }*/

        System.out.println("该随机数组最外圈元素和为:"+sum);

看了一遍又一遍之后,我发现在四个角落里的数被重复计算了四次!!!

其实在这之前,没有考虑到只有行或列的变化,还出现过把16个数全部相加并且乘以4的情况……bug生产家是我没错了( * /ω\*)

多亏了debug调试功能,让我及时更正,没有酿下大错。

所以,现在只需要将每一行或列少计算一个元素,形成闭环,就可以取得最外圈元素的和了!

如图所示……
在这里插入图片描述

咳咳,那第三部分就完成了,接下来看最后一个

求主对角线中最大元素的值及其位置

我查了那么一查,发现好像没有二维数组返回索引值的方法,于是……那自己定义一个吧!!!

说干就干,定义方法,两个明确,一是返回值类型,二是参数。

返回值类型肯定是void啦,参数,一个是之间求出来的最大值,另一个就是生成好的二维数组,知道了这些,火速写了一个方法。

这第四部分的代码就都在此了

//        4.求主对角线中最大元素的值及其位置
        int max=array[0][0];
        for (int i=1;i<array.length;i++){
            int yuansu = array[i][i];
            if (yuansu>max){
                max=yuansu;
            }
        }
        System.out.println("主对角线最大元素为"+max);
        getAddress(array,max);


   /*定义一个方法,实现获取查找元素获得位置的需求
    * 两个明确
    * 返回值类型 void
    * 参数 int array[][] int max*/
    public static void getAddress(int array[][],int max){
        for (int i=0;i<array.length;i++){
            for (int j=0;j<array[i].length;j++){
                if (max==array[i][j]){
                    System.out.println("该最大元素的在数组内的位置为:["+i+"] ["+j+"]");
                    System.out.println("该最大元素的在矩阵内的位置为:["+(i+1)+"] ["+(j+1)+"]");
                }
            }
        }
    }

代码汇总

package classCode.arrays;

import java.util.Arrays;
import java.util.Random;

/*
* 1.利用随机函数产生16个随机数,给一个4*4的二维数组赋值
2.按行列输出数组
3.求最外一圈元素之和
4.求主对角线中最大元素的值及其位置
* */
public class Shuzu {
    public static void main(String[] args) {
//        1.利用随机函数产生16个随机数,给一个4*4的二维数组赋值
        int array[][]=new int[4][4];
//        已知array.length=4

        Random r=new Random();
        for (int i=0;i<array.length;i++){
            for (int j=0;j<array[i].length;j++){
                int num = r.nextInt(100);
                array[i][j]=num;
            }
        }
//        2.按行列输出数组
        for (int i=0;i<array.length;i++){
            for (int j=0;j<array[i].length;j++){
                System.out.print(array[i][j]+"\t");
            }
            System.out.println();
        }

//        3.求最外一圈元素之和
//        3.1 求第一行的和 i不变 j变
        int sum=0;
//        array.length--4
//        array[0].length-1--3
       for (int j=0;j<array[0].length-1;j++){
            sum+=array[0][j];
        }

        /*int sum=0;
        for (int i=0;i<array.length;i++){
            for (int j=0;j<array[i].length;j++){
                sum+=array[0][j];
            }
        }*/

//        3.2 求第一列的和 j不变 i变
        for (int i=1;i<array.length;i++){
            sum+=array[i][0];
        }
        /*for (int i=0;i<array.length;i++){
            for (int j=0;j<array[i].length;j++){
                sum+=array[i][0];
            }
        }*/
//        3.3 求第四行的和 i不变 j变
//        array.length-1--3
//        array[array.length-1].length---4
        for (int j=1;j<array[array.length-1].length;j++){
            sum+=array[array.length-1][j];
        }
        /*for (int i=0;i<array.length;i++){
            for (int j=0;j<array[i].length;j++){
                sum+=array[array.length-1][j];
            }
        }*/
//        3.4 求第四列的和 j不变 i变
//        array.length--4
//        array.length-1--3
       for (int i=0;i<array.length-1;i++){
            sum+=array[i][array.length-1];
        }
       /* for (int i=0;i<array.length;i++){
            for (int j=0;j<array[i].length;j++){
                sum4+=array[i][array.length-1];
            }
        }*/

        System.out.println("该随机数组最外圈元素和为:"+sum);


//        4.求主对角线中最大元素的值及其位置
        int max=array[0][0];
        for (int i=1;i<array.length;i++){
            int yuansu = array[i][i];
            if (yuansu>max){
                max=yuansu;
            }
        }
        System.out.println("主对角线最大元素为"+max);
        getAddress(array,max);


    }
    /*定义一个方法,实现获取查找元素获得位置的需求
    * 两个明确
    * 返回值类型 void
    * 参数 int array[][] int max*/
    public static void getAddress(int array[][],int max){
        for (int i=0;i<array.length;i++){
            for (int j=0;j<array[i].length;j++){
                if (max==array[i][j]){
                    System.out.println("该最大元素的在数组内的位置为:["+i+"] ["+j+"]");
                    System.out.println("该最大元素的在矩阵内的位置为:["+(i+1)+"] ["+(j+1)+"]");
                }
            }
        }
    }

}

以上就是俺分享的全部内容了,两个半小时,是坐在座位上的时间,但是有可能是专注度不够,所以还需要加油提高效率啦!

在写代码的过程中,出现了无数的bug,皆是因为考虑不周导致,为了减少出错率,需要提前想好应该怎么把代码写出来,独立思考以及画示意图都非常的重要!好多都是因为索引和数组长度引起的索引越界……(下回不操心可真的要废了)

感谢父老乡亲们可以看到这儿,比心~

  • 4
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
引用\[2\]中的代码实现可以将二维数组转换为一维数组。具体步骤如下: 1. 首先,获取二维数组的行数和列数,分别用m和n表示。 2. 创建一个长度为m*n的一维数组arr。 3. 使用两个嵌套的for循环遍历二维数组,将每个元素按照顺序存入一维数组arr中。 4. 返回一维数组arr。 以下是一个示例的Java代码实现: ```java public int\[\] convertTo1DArray(int\[\]\[\] matrix) { int m = matrix.length; int n = matrix\[0\].length; int\[\] arr = new int\[m * n\]; int index = 0; for (int i = 0; i < m; i++) { for (int j = 0; j < n; j++) { arr\[index++\] = matrix\[i\]\[j\]; } } return arr; } ``` 这样,你就可以使用上述代码将二维数组转换为一维数组了。 #### 引用[.reference_title] - *1* *3* [Java中一维数组和二维数组的详解](https://blog.csdn.net/lu202032/article/details/116768925)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^control_2,239^v3^insert_chatgpt"}} ] [.reference_item] - *2* [Java一维数组与二维数组的转换](https://blog.csdn.net/manqishizhizhu/article/details/124501666)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^control_2,239^v3^insert_chatgpt"}} ] [.reference_item] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值