Java基础知识(五)& 数组

五、数组

设计知识点如下:
Java基础知识(一)& Jdk和eclipse安装和配置
Java基础知识(二)& 运算符
Java基础知识(三)& Scanner键盘录入和Random随机数
Java基础知识(四)& 流程控制语句

5.1一维数组

5.1.1 一维数组定义

1.问题:如果想要存储一个数或一个值,可以用一个变量来存储,但是变量一次只能存储一个数据,但是能不能想要一次存储多个数据?
2.数组概述:相当于一个容器,数组本身属于引用数据类型
3.作用:一次存储多个数据
4.特点:
    1)既可以存储基本数据类型的数据,还可以存储引用类型的数据
    2)定长(定义数组时长度为多长,就能存多长的数据 )
5.定义:
    1)动态初始化:在定义数组时,没有具体数据,只定长度
       数据类型[]  数组名=new 数据类型[长度]
       数据类型 数组名[] =new 数据类型[长度]
    2)静态初始化:在定义数组时,有具体数据
       数据类型[]  数组名=new 数据类型[]{元素1,元素2...}
       数据类型  数组名[]=new 数据类型[]{元素1,元素2...}
    3)简化静态初始化(推荐使用)
        数据类型[]  数组名={元素1,元素2...}
        
6.动态初始化和静态初始化的区别:
    动态初始化:只知道长度,不知道具体数据,就可以考虑使用动态初始化
    静态初始化:定义时知道具体的数据    
public class ArrayDemo01 {
	public static void main(String[] args) {
		// 动态初始化
		int[] arr1=new int[5];
		String [] arr2=new String[5];
		//静态初始化
		int[] arr3= {1,2,3,4,5,6,7,8};
		String[] arr4= {"java","c","python","c++","html"};
	}
}

5.1.2如何获取数组长度

1.格式:数组名.length
    
public class ArrayDemo02 {
	public static void main(String[] args) {
		int[] a= {23,45,6,7,56,90,68,47};
		int b=a.length;
		System.out.println(b);//8
	}

}

5.1.3 索引

1.解释:元素在数组中存储的位置(编号,下标),索引从0开始。
2.特点:索引唯一、最大索引数组长度-13.作用:操作元素必须通过索引来操作,存、取、查数据都需要指定索引。  

5.1.4存储数据

1.格式:
    数组名[索引]=public class ArrayDemo02 {
	public static void main(String[] args) {
		int[] a= new int[5];
		a[0]=45;
		a[1]=25;
		a[2]=5;
		a[3]=36;
		a[4]=6; 
		System.out.println(a);//[I@2d363fb3 是a数组的地址
	}
}


练习:定义一个长为5的数组,在1-10之间生成一个整数后存储到数组中。
import java.util.Scanner;
public class ArrayDemo3 {
	public static void main(String[] args) {
		Scanner sc =new Scanner(System.in);
		int[] a=new int[5];
		for(int i=0;i<a.length;i++) {
			a[i]=sc.nextInt(10)+1;
		}
	}
}  

5.1.5取数据

1.格式
    数组名[索引]
2.解释:
    1)直接输出数组名,会输出数组在内存中的地址值
    2)地址值:数组在内存中的身份证号,唯一标识,通过唯一标识到内存中找到这个数组,从而操作这个数组中的数据
    3)如果数组中没有数据,直接获取也可以获取,不过是默认值
        
import java.util.Scanner;        
public class ArrayDemo3 {
	public static void main(String[] args) {
		Scanner sc =new Scanner(System.in);
		int[] a=new int[5];
		System.out.println(a[0]);//0
		System.out.println(a[1]);//0
		System.out.println(a[2]);//0

	}
}


import java.util.Scanner;
public class ArrayDemo4 {
	public static void main(String[] args) {
		Scanner sc =new Scanner(System.in);
		int[] a=new int[5];
		for(int i=0;i<a.length;i++) {
			System.out.println("请输入第"+(i+1)+"数");
			a[i]=sc.nextInt(10);
		}
		System.out.println(a[3]);

	}
}

5.1.6 遍历数组

import java.util.Scanner;
public class ArrayDemo5 {
	public static void main(String[] args) {
		Scanner sc =new Scanner(System.in);
		int[] a=new int[5];
		for(int i=0;i<a.length;i++) {
			System.out.println("请输入第"+(i+1)+"数");
			a[i]=sc.nextInt(10);
		}
		for(int j=0;j<a.length;j++) {//遍历数组
			System.out.print(a[j]);
		}	
	}
}

5.1.7异常

error:Exception in thread "main" java.lang.ArrayIndexOutOfBoundsException: Index 5 out of bounds for length 5  索引超出异常,因为 数组最大索引为4,而a[5]则超出索引异常。

public class ArrayDemo02 {
	public static void main(String[] args) {
		int[] a= new int[5];
		a[0]=45;
		a[1]=25;
		a[2]=5;
		a[3]=36;
		a[4]=6; 
		System.out.println(a[5]);
	}
}

5.1.8练习

练习1:求数组中的最大值
public class ArrayDemo04 {
	public static void main(String[] args) {
		int[] arr3= {18,23,3,67,28,6,17,38};
		int max=arr3[0];
		for(int i=0;i<arr3.length;i++) {		
			if(max<arr3[i]) {
				max=arr3[i];
			}
		}
		System.out.println("max="+max);//67

	}

}

练习2:随机产生100100之间的整数,统计既是3又是5的倍数,但不是7的倍数。
import java.util.Random;
public class ArrayHomework {
	public static void main(String[] args) {
		int count=0;
		int[] a =new int[10];
		for (int i=0;i<a.length;i++) {
			Random ra =new Random();
			a[i]=ra.nextInt(100);}
		for(int j=0;j<a.length;j++) {
			if(a[j]%3==0&&a[j]%5==0&&a[j]%7!=0) {
				count++;			
			}
		}
		System.out.println("count="+count);
		}
} 
练习3:定义一个数组,数组的值为{11,22,32,41,56,26,67,28,49,57},遍历数组,输出元素按照[11,22,32,41,56,26,67,28,49,57]进行输出
public class Arraydemo5_format {
	public static void main(String[] args) {
		int[] a={11,22,32,41,56,26,67,28,49,57};
		System.out.print("[");
		for (int i = 0; i <a.length; i++) {
			if(i==a.length-1) {
				System.out.print(a[i]+"]");	
		}else {
			System.out.print(a[i]+",");
	}
			}		
}}    
    
练习4:随机501-100之间的整数,统计偶数个数
    步骤:
    1.创建Random对象
    2.定义长度为50的数组
    3.随机50个存储到数组中
    4.定义count,用于统计偶数个数
    5.遍历数组,判断,如果是true,count++
    6.输出count
    
import java.util.Random;

public class ArrayRandom {

	public static void main(String[] args) {
		int [] a=new int[50];
		Random ra =new Random();
		
		for(int i=0;i<50;i++) {
			a[i]=ra.nextInt(100)+1;
		}
		int count=0;
		for(int j=0;j<a.length;j++) {
			if(a[j]%2==0) {
				count++;
			}
		}
		System.out.println("count="+count);

	}

}

练习5:从键盘输入一个整数,找出整数在数组中的索引位置
    步骤:
    1.创建Scanner对象
    2.定义数组,随便存几个数据
    3.遍历数组,在遍历的同时判断是否与录入的数据是否相等,如果相等,输出索引
import java.util.Scanner;

public class ArrayScanner { 
	public static void main(String[] args) {
		Scanner sc =new Scanner(System.in);
		System.out.println("请输入一个数:");
		int b=sc.nextInt();
		
		int [] a= {12,3,56,34,15,23,57,77,48,66};
		for(int i=0;i<a.length;i++) {
			if(a[i]==b) {
				System.out.println("inder="+i);
			}
		}

	}

}

练习6:数组复制

public class ArrayCopy {

	public static void main(String[] args) {
		int []a1= {1,2,3,5,2,4};
		int []a2=new int[6];
		
		for(int i=0;i<a1.length;i++) {
			a2[i]=a1[i];
		}
		for (int i = 0; i < a2.length; i++) {
			System.out.println(a2[i]);
		
		}

	}

}   

练习7:从键盘输入5个商品名称存到一个长度为5String类型的数据组中,输出所有商品

import java.util.Scanner;

public class ArrayString {

	public static void main(String[] args) {
		String[] arr = new String[5];//声明一个空间为5的字符串空间

	    Scanner scanner=new Scanner(System.in);

	    for(int j=0;j<arr.length;j++){

	    	System.out.println("请输入第"+(j+1)+"个商品名称:");
	    	arr[j]=scanner.next();
	    }

	    System.out.println("数组内容为:");

	    //遍历数组

	    for(int i=0;i<arr.length;i++){
	        System.out.print(arr[i]+" ");
	    }
	}
	}

练习8:循环录入10个学生的java成绩。将成绩按升序或降序打印输出。
import java.util.Arrays;
import java.util.Scanner;

public class GradeSort {

	public static void main(String[] args) {
		double sum=0;//总分初始化为0
	    double[] arr=new double[10];//定义一个长度为8的数组
	    Scanner sc = new Scanner(System.in);

	    for(int i=0;i<arr.length;i++){
	        System.out.println("请输入第"+(i+1)+"个学生成绩:");//输入循环接收8个学生的成绩
	        arr[i] =  sc.nextDouble();
	    }
	    Arrays.sort(arr);//数组排序,默认升序排序
	    for(int j=0;j<arr.length;j++) {
	    	System.out.print(arr[j]+" ");
	    }

	}

}
     
运行结果:
请输入第1个学生成绩:
67
请输入第2个学生成绩:
87
请输入第3个学生成绩:
89
请输入第4个学生成绩:
80
请输入第5个学生成绩:
76
请输入第6个学生成绩:
67
请输入第7个学生成绩:
89
请输入第8个学生成绩:
90
请输入第9个学生成绩:
87
请输入第10个学生成绩:
79
67.0 67.0 76.0 79.0 80.0 87.0 87.0 89.0 89.0 90.0 
    
    
降序排序:
import java.util.Arrays;
import java.util.Scanner;
public class GradeSort {
	public static void main(String[] args) {
		double sum=0;//总分初始化为0
	    double[] arr=new double[10];//定义一个长度为8的数组
	    Scanner sc = new Scanner(System.in);

	    for(int i=0;i<arr.length;i++){
	        System.out.println("请输入第"+(i+1)+"个学生成绩:");//输入循环接收8个学生的成绩
	        arr[i] =  sc.nextDouble();
	    }
	    Arrays.sort(arr);//数组排序,默认升序
	    for(int j=arr.length-1;j>=0;j--) {//逆向输出
	    	System.out.print(arr[j]+" ");
	    }
	}

}    
  
运行结果:
请输入第1个学生成绩:
67
请输入第2个学生成绩:
87
请输入第3个学生成绩:
77
请输入第4个学生成绩:
68
请输入第5个学生成绩:
79
请输入第6个学生成绩:
87
请输入第7个学生成绩:
85
请输入第8个学生成绩:
83
请输入第9个学生成绩:
86
请输入第10个学生成绩:
79
87.0 87.0 86.0 85.0 83.0 79.0 79.0 77.0 68.0 67.0 
    
练习9:声明一个int型的数组,循环接收8个学生的成绩,计算这8个学生的总分及平均分、最高分和最低分。
思路:
1)声明一个长度为8int型数组
2)循环接收8个学生的成绩
3)计算这8个学生的总分及平均分
import java.util.Scanner;
public class GradeAverage {
	public static void main(String[] args) {
		double sum=0;//总分初始化为0
	    double[] arr=new double[8];//定义一个长度为8的数组
	    Scanner sc = new Scanner(System.in);

	    for(int i=0;i<=7;i++){
	        System.out.println("请输入第"+(i+1)+"个学生成绩:");//输入循环接收8个学生的成绩
	        arr[i] =  sc.nextDouble();
	        sum+=arr[i];
	    }
	    double avg =   (sum/arr.length);//计算平均分
	    System.out.println("总分"+sum+" 及平均分"+avg);
	}
}
运行结果:
请输入第1个学生成绩:
88
请输入第2个学生成绩:
77
请输入第3个学生成绩:
80
请输入第4个学生成绩:
79
请输入第5个学生成绩:
88
请输入第6个学生成绩:
79
请输入第7个学生成绩:
90
请输入第8个学生成绩:
99
总分680.0 及平均分85.0

5.2二维数组

5.2.1二维数组的定义

1.解释:数组中套了多个数组
2.定义格式:
    1)动态初始化:在定义数组时,没有具体数据,只定长度
       数据类型[][]  数组名=new 数据类型[m][n]
       数据类型 数组名[][] =new 数据类型[m][n]
       数据类型[] 数组名[] =new 数据类型[m][n]
    m:代表的是二维数组的长度
    n:二维数组中每个一维数组的长度
    数据类型[][]  数组名=new 数据类型[m][]:二维数组中一维数组没有被创建
        
    2)静态初始化:在定义数组时,有具体数据
       数据类型[][]  数组名=new 数据类型[][]{{元素1,元素2,元素3...}{元素1,元素2,元素3...}...}
       数据类型 数组名[][] =new 数据类型[][]{{元素1,元素2,元素3...}{元素1,元素2,元素3...}...}
       数据类型[] 数组名[] =new 数据类型[][]{{元素1,元素2,元素3...}{元素1,元素2,元素3...}...}
    3)简化静态初始化(推荐使用)
       数据类型[][]  数组名={{元素1,元素2,元素3...}{元素1,元素2,元素3...}...}
       数据类型 数组名[][] ={{元素1,元素2,元素3...}{元素1,元素2,元素3...}...}
       数据类型[] 数组名[] ={{元素1,元素2,元素3...}{元素1,元素2,元素3...}...}

public class SecondArray {

	public static void main(String[] args) {
		int[][] a1=new int[3][4];
		int[][] a2=new int[3][];
		System.out.println("================");
		String[][] a3= {{"java","javascript"},{"python","c"},{"c++"}};
		System.out.println(a3);//[[Ljava.lang.String;@2d363fb3

	}

}

在这里插入图片描述

5.2.2二维数组长度

1.格式
    数组名.length
public class SecondArray {
	public static void main(String[] args) {
		String[][] a3= {{"java","javascript"},{"python","c"},{"c++"}};
		System.out.println(a3.length);//3
	}
}



//获取每一个一维数组的长度
public class SecondArray {
	public static void main(String[] args) {

		String[][] a3= {{"java","javascript"},{"python","c"},{"c++"}};
		System.out.println(a3.length);//3
		System.out.println("===========");
	
		//获取每一个一维数组的长度
		for(int i=0;i<a3.length;i++) {
			System.out.println(a3[i].length);//a[i]代表每一个一维数组
		}
	}
}

5.2.3二维数组存&取&遍历

public class SecondArray {
	public static void main(String[] args) {

		String[][] a3= new String[2][2];
		a3[0][0]="java";
		a3[0][1]="javascript";
		a3[1][0]="python";
		a3[1][1]="c";
		
		for(int i=0;i<a3.length;i++) {
			for(int j=0;j<a3[i].length;j++) {
				System.out.print(a3[i][j]+" ");
		}
			System.out.println();
			}

	}
}

运行结果:
java javascript 
python c 

练习3:打印杨辉三角
思路:
1)定义一个二维数组,长度由手动输入
2)使用循环语句,将数组的第一列和最后一列都是1
3)从第三行开始,数据的每一个数据是它上一行的前一列和它上一行的本列之和
4)遍历输出二维数组
在这里插入图片描述

import java.util.Scanner;
public class Yanghui {
	public static void main(String[] args) {
		//创建键盘录入对象
		Scanner sc = new Scanner(System.in);	
		//键盘录入。
		System.out.println("请输入数组的长度:");
		int n = sc.nextInt();
		//定义二维数组
		int[][] arr = new int[n][n];
		//给这个二维数组任何一行的第一列和最后一列赋值为1
		for(int x=0; x<arr.length; x++) {
		arr[x][0] = 1; //任何一行第1列
		arr[x][x] = 1; //任何一行的最后1列
		}
	
		//从第三行开始,每一个数据是它上一行的前一列和它上一行的本列之和。
		for(int x=2; x<arr.length; x++) {
		//这里如果y<=x是有个小问题的,就是最后一列的问题(因为最后一列已经有值了),所以最后一列不用再赋值,这里要减去1
		//并且y也应该从1开始,因为第一列也是有值了,第一列不用再赋值,所以y从1开始计数
			for(int y=1; y<=x-1; y++) {
			//每一个数据是它上一行的前一列和它上一行的本列之和。
			arr[x][y] = arr[x-1][y-1] + arr[x-1][y];//记住:“外行内列”	
			}}

		//遍历二维数组
		for(int x=0; x<arr.length; x++) {
			for(int y=0; y<=x; y++) {//注意这里不是写成y<arr[x].length,要实现“阶梯形状”的固定写法y<=x
			System.out.print(arr[x][y]+"\t");}
		System.out.println();
		}
	}
}

知识点不断更新,望博友们学到东西,同时也希望给与指点和建议,谢谢!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值