zoukankan      html  css  js  c++  java
  • 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("否");
    			}
    		}
    }
    
    
  • 相关阅读:
    Microsoft Enterprise Library 5.0 系列(二) Cryptography Application Block (初级)
    Microsoft Enterprise Library 5.0 系列(五) Data Access Application Block
    Microsoft Enterprise Library 5.0 系列(八) Unity Dependency Injection and Interception
    Microsoft Enterprise Library 5.0 系列(九) Policy Injection Application Block
    Microsoft Enterprise Library 5.0 系列(三) Validation Application Block (高级)
    软件研发打油诗祝大家节日快乐
    从挖井的故事中想到开发管理中最容易忽视的几个简单道理
    ITIL管理思想的执行工具发布
    管理类软件设计“渔”之演化
    20070926日下午工作流与ITILQQ群 事件管理 讨论聊天记录
  • 原文地址:https://www.cnblogs.com/DL50/p/15782362.html
Copyright © 2011-2022 走看看