五、数组
设计知识点如下:
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.特点:索引唯一、最大索引数组长度-1、
3.作用:操作元素必须通过索引来操作,存、取、查数据都需要指定索引。
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:随机产生10个0到100之间的整数,统计既是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:随机50个1-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个商品名称存到一个长度为5的String类型的数据组中,输出所有商品
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)声明一个长度为8的int型数组
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();
}
}
}
知识点不断更新,望博友们学到东西,同时也希望给与指点和建议,谢谢!