多维数组
(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");
}
}