• Java 二维数组


    二维数组

    快速入门

    请用二维数组输出如下图形

    0 0 0 0 0 0

    0 0 1 0 0 0

    0 2 0 3 0 0

    0 0 0 0 0 0

    代码如下:

    package ArrayList_Practice;
    
    public class TwoDimensionalArray01 {
    	public static void main(String[] args) {
    		int arr[][] = {{0,0,0,0,0,0},{0,0,1,0,0,0},
    					   {0,2,0,3,0,0},{0,0,0,0,0,0} };
    		System.out.println("矩阵如下");
    		//输出二维图形
    		for (int i = 0; i < arr.length; i++) {//遍历二维数组的每个元素
    			//遍历二维数组的每个元素(元素)
    			//1.arr[i] 表示二维数组的第一个元素,二维数组每个元素又是一个一维数组
    			//2.arr[i].length 得到二维数组每个一维数组的长度
    			for (int j = 0; j < arr[i].length; j++) {
    				System.out.print(arr[i][j] + " ");
    			}
    				System.out.println();//换行
    		}
    	}
    }
    
    

    运行图:

    image-20220108153032994

    一、相关概念

    定义:

    1. 形式上看int[][]

    2. 原来的一维数组的每个元素是一维数组,就构成二维数组

    3. 二维数组的每个元素是一维数组, 所以如果需要得到每个一维数组的值,还需要再次遍历

    4. 统计二维数组有多少个元素(数组)

      使用:System.out.println("二维数组的元素个数:"+ arr.length); 进行统计
      

    ​ 5.如果我们要访问第 (i+1)个一维数组的第j+1个值

    System.out.println(arr[2][3]);
    

    二、动态初始化

    2.1动态初始化的各种方法

    方法一

    语法: 类型 [][] 数组名=new 类型[大小][大小]

    • 第一个[]表示有几个一维数组
    • 第二个[]表示这个一维数组中有几个元素
     比如: int a[][]=new int[2][3]
    

    方法二

    1. 先声明:类型 数组名[][];

    2. 再定义(开辟空间) 数组名 = new 类型[ 大小][大小]

    3. 赋值(有默认值,比如 int 类型的就是0)

    package TwoDimenSionalArray;
    
    public class TowDimensionalArray01 {
    	public static void main(String[] args) {
    //		int arr[][] = new int[2][3];
    		
    		int arr[][];
    		arr = new int[2][3];
    		//遍历arr数组
    		arr[1][1] = 8;
    		for (int i = 0; i < arr.length; i++) {
    			for (int j = 0; j < arr[i].length; j++) {
    				System.out.print(arr[i][j] + " ");
    			}
    			System.out.println();
    		}
    	}
    }
    
    

    方法三

    动态初始化-列数不确定

    /*
    			看一个需求:动态创建下面二维数组,并输出
    			i = 0: 1
    			i = 1: 2 2
    			i = 2: 3 3 3 一个有三个一维数组, 每个一维数组的元素是不一样的
    		*/
    		int arr[][] = new int[3][];//列数不确定,这里只是确定一维数组的空间,不同于c语言,c语言只能行数不确定
    		//遍历arr的每个一维数组
    		for (int i = 0; i < arr.length; i++) {
    			//给每个一维数组开空间, new
    			//如果没有给一维数组 new , 那么 arr[i]就是null 
    			arr[i] = new int[i+1];
    			
    			//遍历一维数组,并给一维数组的每个元素赋值
    			for (int j = 0; j < arr[i].length; j++) {
    				arr[i][j] = i+1;
    			}
    		}
    		
    		//遍历
    		for (int i = 0; i < arr.length; i++) {
    		
    			for (int j = 0; j < arr[i].length; j++) {
    				System.out.print(arr[i][j]+" ");
    			}
    			System.out.println();
    		}
    

    个人理解:

    1. int arr[][] = new int[3][];只是声明了二维数组中,包含的一维数组个数,但每个元素由于没有开辟空间,所以是NULL指针
    2. 开辟空间,是让 arr数组指向一个能存放i+1个int 的空间,这样一维数组就能有地址了

    运行效果:

    image-20220108162131695

    方法四

    定义 类型 数组名[][] = {{值 1,值 2..},{值 1,值 2..}

    比如

    int[][] arr = {{1,1,1}, {8,8,9},{100}}
    1.定义了一个二维数组 arr
    2.arr数组中有三个元素,第二个一维数组有3个元素,第三个一维素组有1个元素
    
    package TwoDimenSionalArray;
    
    public class TwoDimensionalArray02 {
    	public static void main (String [] args) {
    		//遍历该数组,并得到它的和
    		int arr[][] = {{4,6},{1,4,5,7},{-2}};
    		int sum = 0;
    		System.out.println("====arr数组元素====");
    		for (int i = 0; i < arr.length; i++) {
    			for (int j = 0; j < arr[i].length; j++) {
    				sum += arr[i][j];
    				System.out.print(arr[i][j]+" ");
    			}
    			System.out.println();
    		}
    		System.out.println("各元素的和:"+sum);
    		
    	}
    }
    
    

    运行结果:

    ====arr数组元素====
    4 6 
    1 4 5 7 
    -2 
    各元素的和:25
    

    2.2二维数组在内存中的形式

    image-20220108155719675

    注意:

    1. 在java里面如果没有给数组赋值,它由默认值,int 为 0,区别于c语言

    2.3注意事项和使用细节

    1. 一维数组的声明方式有

      int[]x 或者 int x[]
      
    2. 二维数组的声明方式有:

      int[][]y 或者 int[]y[] 或者 int y[][]
      
    3. 二维数组实际上是由多个一维数组组成的,它的各个一维数组的长度可以相同,也可以不相同

    三、练习

    3.1杨辉三角

    package TwoDimenSionalArray;
    
    public class YangHui {
    	public static void main(String[] args) {
    	/*	
    	 * 杨慧三角
    	 *  使用二维数组打印一个 10 行杨辉三
    	 *	1
    	 *	1 1
    	 *	1 2 1
    	 *	1 3 3 1
    	 *	1 4 6 4 1
    	 *	1 5 10 10 5 1
         *
    	 *	规律
    	 *	1.第一行有 1 个元素, 第 n 行有 n 个元素
    	 *	2. 每一行的第一个元素和最后一个元素都是 1
    	 *	3. 从第三行开始, 对于非第一个元素和最后一个元素的元素的值.
    	*/
    		int yangHui[][] = new int[12][];
    		System.out.println("===杨辉三角如下===");
    		for (int i = 0; i < yangHui.length; i++) {
    			//给每个一维数组(行)开辟空间,
    			yangHui[i] = new int[i+1];
    			//给每一个一维数组(行)赋值
    			for (int j = 0; j < yangHui[i].length; j++) {
    				//第一个和最后一个赋值为1
    				if( j == 0 || j == yangHui[i].length -1) {
    					yangHui[i][j] = 1;
    				}else {
    					//不是第一个也不是最后一个,那么就把i-1 行 第j列 和i-1 行 第 j-1列 的值加起来
    					yangHui[i][j] = yangHui[i-1][j-1] + yangHui[i-1][j];
    				}
    			}
    			
    		}
    		for (int i = 0; i < yangHui.length; i++) {
    			for (int j = 0; j < yangHui[i].length; j++) {
    				System.out.print(yangHui[i][j]+"  ");
    			}
    				System.out.println();
    		}
    		
    	}
    }
    

    运行效果:

    image-20220109212407578

    3.2客观题

    image-20220108203953107

    3.3插入

    题目:已知一个升序序列要求插入一个元素,该数组依然是升序

    package TwoArrayHomeWroks;
    
    import java.util.Iterator;
    
    public class Homework04 {
    	public static void main(String[] args) {
    		//已知一个升序的数组,要求插入一个元素,该数组是升序
    
    		int[] array = { 10, 12, 45, 90 };
    		int[] newArray = new int[array.length + 1];
    		int key = 0;
    		int temp = 0;
    		int index = 0;
    		
    		System.out.println("====插入之前====");
    		//插入之前
    		for (int i = 0; i < array.length; i++) {
    			System.out.print(array[i] +" ");
    		}
    		
    		//确定要插入的下标
    		for (int i = 0; i < array.length; i++) {
    			if( array[i]>= key) {
    				index = i;
    				break;
    			}
    			
    			if(i == array.length-1 && index == 0){
    				index = array.length;
    			}
    		}
    		
    		//进行插入,利用两个数组
    		for (int i = 0, j = 0; i < newArray.length; i++) {
    			if( i== index) {
    				newArray[i] = key;
    				
    			}else {
    				newArray[i] = array[j];
    				j++;
    			}
    		}
    		
    		System.out.println("\n====插入之后====");
    		for (int i = 0; i < newArray.length; i++) {
    			System.out.print(newArray[i]+" ");
    		}
    		
    	}
    }
    
    

    3.4最大值最小值

    题目:

    • 随机生成10个整数(1~100)保存到数组,并逆序打印,求平均值,最大值的下标,最小值的下标,并查找里面是否有8
    package TwoArrayHomeWroks;
    
    import java.util.Random;
    
    
    public class Homework05 {
    		public static void main(String[] args) {
    			double average = 0;
    			int sum = 0;
    			int max = 0;
    			int min = 0;
    			int key = 8;
    			int arr[] = new int[10];
    			boolean flag = false;
    			
    			//正序打印
    			System.out.println("====正序打印====");
    			Random random = new Random();
    			for (int i = 0; i < arr.length; i++) {
    				int temp = random.nextInt(100);
    				arr[i] = temp;
    				//打印
    				System.out.print(arr[i] + " ");
    				sum += temp;
    				if(temp == key) {
    					flag = true;
    				}
    			}
    			average = sum*1.0/ arr.length;
    			
    			//逆序打印
    			System.out.println("\n====逆序打印====");
    			for(int i = arr.length - 1 ; i >= 0 ; i--) {
    				System.out.print(arr[i] + " ");
    			}
    			
    			//找到最小值 和最大值的下标
    			for (int i = 0; i < arr.length; i++) {
    				if(arr[max] < arr[i]){
    					max = i;
    				}
    				if(arr[min] > arr[i]) {
    					min = i;
    				}
    			}
    			
    			
    			System.out.println("\n平均值为:" + average);
    			System.out.println("最大值下标" + max);
    			System.out.println("最小值下标" + min);
    			System.out.print("是否有8:");
    			if(flag) {
    				System.out.print("是");
    			}else {
    				System.out.println("否");
    			}
    		}
    }
    
    
  • 相关阅读:
    FPGA中latency与delay概念的区别
    @transactional注解在什么情况下会失效,为什么。
    一个ArrayList在循环过程中删除,会不会出问题,为什么?
    HashMap在高并发下如果没有处理线程安全会有怎样的安全隐患,具体表现是什么
    JVM调优
    正确截取List指定位置的内容
    ArrayList源码解析
    接口和抽象类的区别(JDK1.8)
    Hashtable源码解析
    Kotlin实践记录
  • 原文地址:https://www.cnblogs.com/DL50/p/15782362.html
Copyright © 2020-2023  润新知