一.数组:
1.定义:
数组: 是一个变量,存储相同数据类型的一组数据,声明一个数组就是在内存空间划出一串连续的空间
2.组成:
- 元素类型:指定数组中存放值的数据类型
- 标识符(变量名):数组名称
- 数组元素(变量值):存放在数组中的数据
- 元素下标/角标:;存放在数组中的数据指定的编号,从0开始,用于操作数组中的数据
重点: 数组中存放的一定是相同的数据类型,数组的角标从0开始
3.数组创建语法:
方式一: 先声明,再分配空间,再赋值
int[] studentScore; //声明数组:数据类型 [] 数组名;
studentScore=new int[10]; //分配空间:数组名= new 数据类型[长度];
studentScore[0]=89; //赋值:数组名[数组下标]=数据值;
方式二: 边声明边分配空间,再赋值
int[] studentScore=new int[10]; //声明并分配空间: 数据类型 [] 数组名=new 数据类型[长度];
studentScore[0]=89; //赋值: 数组名[数组下标]=数据值;
方式三: 边声明边赋值:
int[] studentScore={89,90,87,98}; //声明并赋值:数据类型[] 数组名={value1,value2,value3...};
或
//声明并赋值:数据类型[] 数组名=new 数据类型[]{value1,value2,value3...};
int[] studentScore=new int[]{89,90,87,98};
注意:
- 该方式在声明时直接赋值,不能指定长度,即不能写成 int[] studentScore =new int[4]{89,90,87,98};
4.数组具体使用案例
案例:
1、计算全班学员的平均分?
package cn.hz.demo2;
import java.util.Scanner;
/**
* 数组具体使用
* 需求:
* 计算5位同学的平均分
* 需求分析:
* 先声明,再赋值
* 1.5位同学分数--double[]
* 2.5位同学分数录入--for(){}
* 2.求总分-求和--for(){}
*
* @author hz
*
*/public class Demo1 {
public static void main(String[] args) {
Scanner input=new Scanner(System.in);
//定义变量和数组
double sum=0.0,avg=0.0;
double[] studentScore=new double[5];
//赋值
for (int i = 0; i <5; i++) {
System.out.println("请输入第"+(i+1)+"位同学的分数");
studentScore[i]=input.nextDouble();
}
//计算
for (int i = 0; i < 5; i++) {
sum=sum+studentScore[i]; //sum+=studentScore[i];
}
//求平均分
avg=sum/5;
System.out.println("5位同学的平均分是"+avg);
}
}
2、在一系列数组插入一个数
package cn.hz.demo4;
import java.util.Arrays;
import java.util.Scanner;
/**
* 需求:
* 有一组学员的成绩{99,85,82,63, 60},将它们按升序排列。要增加一个学员的成绩,将它插入成绩序列,并保持升序 90,89,78
*
*
* 需求分析:
* 0.定义数组的时候个数应该6,最后0;
* 1.升序: Arrays.sort; 60,63,82,85,99,0
* 2.获取插入数据在数组中对应的下标 77 if(num>arr[i]){} i----num
* 3.将获取到角标以后的数字全部后移 99-0,85-99,82-85
* 4.将需要插入的数字通过角标放入到数组中
*
* 如果将数组内容进行排序:自己编写排序方法
* @author hz
*
*/public class Demo2 {
public static void main(String[] args) {
Scanner input =new Scanner(System.in);
int[] scores=new int[6];
scores[0]=99;
scores[1]=85;
scores[2]=82;
scores[3]=63;
scores[4]=60;
//定义变量用于接受下标
int index=scores.length-1;
System.out.println("请输入需要查找的数字");
int num=input.nextInt();
//获取位置
for (int i = 0; i < scores.length; i++) {
//当前数组内容为降序,找到需要查找数据第一次比较大
if(num>scores[i]){
index=i;
//获取到角标以后直接结束循环
break;
}
}
//将获取到的角标的后面所有内容全部后移
for(int j=scores.length-1;j>index;j--){
//从最后一个数字开始,将前面一个的值给后面
scores[j]=scores[j-1];
}
//将新数字插入到数组中
scores[index]=num;
//排序
Arrays.sort(scores);
for(int i=0;i<scores.length;i++){
System.out.print(scores[i]+"t");
}
}
}
5.数组常见错误分析
常见错误1:
常见错误2:
常见错误3:
小结:
- 数组是(相同类型数据)的(有序)(集合)
- 数组会在内存中开辟一块连续的空间,每个空间相当于之前的一个变量,称为数组的元素element
- 元素的表示 数组名[下标或者索引]: scores[7] scores[0] scores[9]
- 数组索引从0开始
- 每个数组元素有默认值 double为 0.0; boolean为 false; int为 0;
- 数组元素有序的,不是大小顺序,是索引 的顺序
- 数组中可以存储基本数据类型,可以存储引用数据类型;但是对于一个数组而言,数组的类型是固定的,只能是一个
- 数组的长度是固定的,一经定义,不能再发生变化(数组的扩容
数组是(相同类型数据)的(有序)(集合)
二.二维数组
有些场合需要多个数组同时进行定义内容,是否可以将数组放入数组进行数据的存储?
将一维数组放入另一个数组,该数组为二维数组
1.二维数组定义声明:
int[][] arr1; //数据类型 [] [] 数组名;
或
int arr1 [][]; //数据类型 数组名 [] [] ;
2.二位数组分配空间
//数据类型[] [] 数组名 =new 数据类型[ 表示有多少个一维数组,必填] [表示一维数组的个数,可填]
int[][] arr1=new int[5][];
//数组名[下标]=new 数据类型[len]; 指定一维数组长度
arr1[0]=new int[9];
3.二维数组赋值:
//数据类型[] [] 数组名 =new 数据类型[ 表示有多少个一维数组,必填] [表示一维数组的个数,可填]
int [] [] arr1=new int[5] [6];
//表示给二维数组中的第一个一维数组中的第一个值赋值10
arr1[0] [0] =10:
或
//数据类型[] [] 数组名={{...}{...}...} ,,定义二维数组的同时直接赋值
int[] [] arr1={{78,89,23,56},{78,89,90},{10}}
4.内存结构:
5.二维数组具体使用:杨慧三角
package cn.hz.demo2;
/**
* 杨辉三角
* @author hz
*
* 需求分析:
* 第n行有n个数字.
* 每一行的开始和结尾数字都为1.
* 用二维数组表示就是a[i][0]=1; a[i][j]=1(当i==j时);
* n+1行的第i个数字等于第n行的i-1个数字加上第n行的i个数字。
*用二维数组表示就是 a[i+1][j]=a[i][j-1]+a[i][j];
*
*/public class Demo1{
public static void main(String[] args) {
int[][]a=new int[10][];
//初始化二维数组
for (int i=0;i<a.length ;i++ ){
//二维数组中的一位数组长度空间确定
a[i]=new int[i+1];
}
//对于a[i]赋值先对两边赋值
for (int i=0;i<a.length ;i++ ){
a[i][i]=1;
a[i][0]=1;
}
//再对内部进行赋值
for (int i=2;i<a.length ;i++ ){
for (int j=1;j<i ;j++ ){
a[i][j]=a[i-1][j-1]+a[i-1][j];
}
}
//遍历
for (int i=0;i<a.length ;i++ ){
for (int j=0;j<a[i].length ;j++ ) {
System.out.print(a[i][j]+"t");
}
System.out.println();
}
}
}
结果如下: