Java基础24(多维数组)

多维数组

(1)二维数组的使用
请用二维数组输出如下图形
0 0 0 0 0 0
0 0 1 0 0 0
0 2 0 3 0 0
0 0 0 0 0 0

代码实现与西路分析:

public static void main(String[] args) {
		//什么是二维数组:
		//1.从定义形式上看 int[][]
		//2.可以这样理解,原来的一维数组的每个元素是一维数组,就构成二位数组
		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}};
		
		//输出二维图形
		for(int i=0;i<arr.length;i++){
			//遍历二维数组的每个元素(数组)
			//1.arr[i]表示二维数组的第i+1个元素 比如arr[0]:二维数组的第一个元素
			//1.arr[i].length 得到 对应的 每个一维数组的长度
			for(int j=0;j<arr[i].length;j++){
				//输出一维数组
				System.out.print(arr[i][j]+" "); 
			}
			System.out.println();//换行
		}
		
		//关于二维数组的关键概念
		//(1)
		System.out.println("二维数组的元素个数"+arr.length);
		//(2)二维数组的每个元素是一维数组,所以如果需要得到每一个一维数组的值还需要再次遍历
		//(3)如果我们要访问第(i+1)个一维数组的第j+1个值 arr[i][j]
		//     举例 : 访问3,=> 他是第3个一维数组的第4个值 arr[2][3]
	}

(2)二维数组的使用:

使用方式1:动态初始化
1)语法:类型[] [] 数组名 = new 类型[大小][大小]
2)比如:int a[] [] = new int[2][3]
3)二维数组在内存的存在形式

演示:

public static void main(String[] args) {
		int arr[][]=new int[2][3];
		
		arr[1][1]=8;//第二行第二个元素改为8
		
		//遍历arr数组
		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();//换行
		}
	}

内存分析图例:
在这里插入图片描述

使用方式2:动态初始化

1)先声明:类型 数组名[][];
2)再定义(开辟空间)数组名 = new类型[大小][大小]
3)赋值(有默认值,比如int 类型的就是0)

演示:

public static void main(String[] args) {
		int arr[][];//声明二位数组
		arr= new int[2][3]; //再开空间
		arr[1][1]=8;
		//遍历arr数组
		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();//换行
		}
	}

使用方式3:动态初始化-列数不确定
1)看一个需求:动态创建下面二维数组,并输出。
在这里插入图片描述
完成案例:

public static void main(String[] args) {
        //一个三维数组,每个一维数组的元素是不一样的
		int arr[][]=new int[3][]; //创建二维数组,一个有3个一维数组,但是只是确定一维数组的个数
		
		for(int i=0;i<arr.length;i++){ //遍历arr每个一维数组
			//给每个一维数组开空间 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; //赋值
			}
		}
		//遍历arr输出
		for(int i=0;i<arr.length;i++){
			//输出arr的每一个一维数组
			for(int j=0;j<arr[i].length;j++){
				System.out.print(arr[i][j]+" ");
			}
			System.out.println();
		}
	}

使用方式4:静态初始化
1.定义 类型 数组名[][] = {{值1,值2…},{值1,值2…},{值1,值2…}}
2.使用即可【固定方式访问】

比如:
int [] [] arr = {{1,1,1},{8,8,9},{100}];

解读:
1.定义了一个二维数组 arr
2.arr有三个元素(美格尔元素都是一维数组)
3.第一个一维数组有3个元素,第二个一维数组有3个元素,第三个一维数组有1个元素

如果把数组改为:
int [] [] arr = {{1,1,1},{8,8,9},100];
则会报错,因为100为int类型,无法转换为int [] ,类型不兼容

(3)二维数组的遍历:

int arr[][] = {{4,6},{1,4,5,7},{-2}};

public static void main(String[] args) {
		//int arr[][] = {{4,6},{1,4,5,7},{-2}}; 遍历该二维数组,并得到和 
		
		//思路:
		//1.遍历二维数组,并将各个值累积到 int sum
		int arr[][] = {{4,6},{1,4,5,7},{-2}};
		int sum=0;
		for(int i=0;i<arr.length;i++){
			//遍历每个一维数组
			for(int j=0;j<arr[i].length;j++){
				System.out.print(arr[i][j]+" ");
				sum += arr[i][j];
			}
		}
		System.out.println("sum"+sum);
	}

二维数组应用案例:
使用二维数组打印一个10行的杨辉三角

1
1 1
1 2 1
1 3 3 1
1 4 6 4 1

思路分析:

1.每一行有1个元素,第n行有n个元素
2.每一行的第一个元素和最后一个元素都是1
3.从第三行开始,对于非第一个元素和最后一个元素的元素的值。
arr[i][j] = arr[i-1][j] + arr[i-1][j-1] ;

代码实现:

public static void main(String[] args) {
	  
		int arr[][]=new int[10][];
		
		for(int i=0;i<arr.length;i++){ // 遍历arr的每个元素
			//给每个一位数组(行)开辟空间
			arr[i] = new int[i+1];
			//给每个一位数组(行)赋值
			for(int j=0;j<arr[i].length;j++){
				//每一行的第一个元素和最后一个元素都是1
				if(j==0 || j==arr[i].length-1){
                    arr[i][j]=1;
				}else{ //中间的元素
					arr[i][j]=arr[i-1][j]+arr[i-1][j-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[] x 或者 int x[]

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

3.二维数组实际上是由多个一位数组组成的,它的各个一位数组的长度可以相同,也可以不相同。比如:map[] [] 是一个二维数组
int map [] [] = {{1,2},{3,4,5}}
由map[0]是一个含有两个元素的一位数组,map[1]是一个含有三个元素的一位数组构成,我们也成为列数不等的二维数组。

二维数组习题:

1.已知有个升序的数组,要求插入一个元素,该数组顺序依然是升序,比如:[10,12,45,90],添加23后,数组为[10,12,23,45,90]

思路与分析:
本质为 数组扩容+定位
1.先确定添加数应该插入到哪个索引
2.然后扩容

//先定义原数组
int [] arr = {10,12,45,90};
int insertNum = 2323;
int index = -1; //index就是要插入的位置

//遍历arr数组,如果发现 insertNum <= arr[i] ,说明i就是要插入的位置
//使用index保留 index = i;
//如果遍历后,没有发现 insertNum<arr[i],说明 index = arr.length
//即:添加到arr的最后

for(int i=0;i<arr.length;i++){
   if(insertNum<=arr[i]){
       index=i;
       break;  //找到位置后,就退出
   }
}

//判断index的值
if(index == -1){  //说明没有找到位置
   index = arr.length;
}

//扩容
//先创建一个新的数组,大小 arr.length+1
int [] arrNew = new int[arr.length+1];
//下面讲arr的元素拷贝到arrNew,并且要跳过index位置  

//i控制arrNew的下标,j用来控制arr数组的下标
for(int i=0,j=0;i<arrNew.length;i++){
   if(i!=index){ //说明可以把arr的元素拷贝到arrNew
     arrNew[i]=arr[j];
     j++;
   }else{ // i这个位置就是要插入的数
     arrNew[i] = insertNum;
   }
  }
 //让arr指向arrNew,原来的数组,就成为垃圾,被销毁
     arr= arrNew;
 
   System.out.println("插入后arr的元素情况");
   for(int i=0;i<arr.length;i++){
  
   }
}    



实操做法:

public static void main(String[] args) {
     	
	int arr[] = {10,12,45,90};	
	Scanner sc = new Scanner(System.in);
	System.out.println("输入要添加的元素:");
	int num = sc.nextInt();
	
	int arrNew[] = new int[arr.length+1];
	
	for(int i=0;i<arr.length;i++){
		arrNew[i]=arr[i];
	}
	arrNew[arrNew.length-1]=num;
	arr=arrNew;
	
	
	for(int i=0;i<arr.length;i++){
		for(int j=0;j<=i;j++){
			if(arr[i]<arr[j]){
				int temp = arr[i];
				arr[i]=arr[j];
				arr[j]=temp;
			}
		}
	}
	
	for(int i=0;i<arr.length;i++){
		System.out.print(arr[i] + " ");
		System.out.print(arr[i]+" ");
	}
  }

2.随机生成10个整数(1-100的范围)保存到数组,并倒序打印以及求平均值,求最大值和最大值的下标、并查找里面是否有8

思路与代码实现:

public static void main(String[] args) {
		
//		随机生成10个整数(1-100的范围)保存到数组,并倒序打印以及
//		求平均值,求最大值和最大值的下标、并查找里面是否有8
		
		int arr[] = new int[10];
//		arr[i]=(int)(Math.random()*100)+1 生成 随机数 1-100
		
		for(int i=0;i<arr.length;i++){
			arr[i]=(int)(Math.random()*100)+1;
		}
		
		System.out.println("倒序打印");
		for(int i=arr.length-1;i>=0;i--){
			System.out.print(arr[i]+" ");
		}
		
		//平均值,求最大值和最大值的下标
		
		double sum=arr[0];
		int max=arr[0];
		int maxIndex=0;
		for(int i=1;i<arr.length;i++){
			
			sum=+arr[i]; //累积和
			
			if(max<arr[i]){  //说明max不是最大值,就变化
				max=arr[i];
				maxIndex=i;
			}
		}
		System.out.println("平均值为:"+sum/10+" 最大值为:"+max+", 下标为:"+maxIndex);
		
		//查找数组中是否有8->使用顺序查找
		int findNum=8;
		int index=-1;  //如果找到,就把下标记录到index
		for(int i=0;i<arr.length;i++){
			if(findNum==arr[i]){
				System.out.println("找到数"+findNum+"下标="+i);
				index=i;
				break;
			}
		}
		
		
		if(index==-1){
			System.out.println("没有找到数"+findNum);
		}
	}

实操代码:

public static void main(St
ring[] args) {		
		int arr[] = new int[10];
//		arr[i]=(int)(Math.random()*100)+1 生成 随机数 1-100
		
		for(int i=0;i<arr.length;i++){
			arr[i]=(int)(Math.random()*100)+1;
		}
		
		System.out.println("倒序打印");
		for(int i=arr.length-1;i>=0;i--){
			System.out.print(arr[i]+" ");
		}
		
		double sum=0;
		int max=0;
		int index=0;
		boolean yes=false;
		for(int i=0;i<arr.length;i++){
			if(max<arr[i]){
				max=arr[i];
				index=i;
			}
			if(arr[i]==8){
				yes=true;
			}
			sum=sum+arr[i];
		}
		System.out.println("平均值为:"+sum/10+" 最大值为:"+max+", 下标为:"+index);
		if(yes==true){
			System.out.println("10个数里有8");			
		}else{
			System.out.println("10个数内没有8");
		}
	}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值