数组
在编写代码时,会有相同类型的数值,如果每次都声明类型会显得很麻烦,那我们可不可以把相同类型的数据放在一起呢?答案是可以的,这里就会用到我们本节要回顾的知识点--------数组,话不多说,进入正题。
数组的概念
数组可以理解为一组类型相同,长度固定的数据集合。
数组的定义
1.第一种定义方式
int[] array=new int[5];
2.第二种定义方式
int[] array2=new int[]{1,2,3,4,5}
3.第三种定义方式
int[] array3={1,2,3,4,5}
数组的遍历
- for循环
//案例:输入5名学员的java成绩,并求出平均数。
public static void main(String[] args) {
double arry[]=new double[5];//定义数组和数组的长度
Scanner sc=new Scanner(System.in);
double sum=0;
for (int i = 0; i <arry.length; i++) {
System.out.println("请输入第"+(i+1)+"名学生的Java成绩:");
arry[i]=sc.nextDouble();//为数组元素赋值
sum+=arry[i];//累加数组中的元素
}
System.out.println("这五名学员的平均java成绩为:"+(sum/5));
}
- while循环
//打印出数组的所有元素。
int[] arry=new int{1,2,3,4,5};
//while循环
int i=0;
while (i<arry.length){
System.out.print(arry[i]+"\t");
i++;
}
System.out.println();
3 foreach遍历
float[] arrf=new float[7];//定义数组,并声明长度
arrf[2]=67.9f;//给第三个赋值,从0开始,所以第3个就等于arrf[3-1],同下
arrf[4]=56.4f;
for (float f:arrf) {
System.out.println(f);
}
数组的复杂应用
打印*图案
1.打印矩形图案
//打印边长为5的矩形
for (int i = 0; i < 5; i++) {
for (int j = 0; j <5 ; j++) {
System.out.print("* ");
}
System.out.println();
}
2.打印平行四边形
for (int i = 0; i<5; i++) {
//打印空格
for (int j =0; j<5-i; j++) {
System.out.print(" ");
}
//打印*号
for (int k = 0; k <5; k++) {
System.out.print("*");
}
System.out.println();
}
3.打印三角形
for (int i = 0; i <5 ; i++) {
System.out.print(" ");
//打印空格
for (int j = 0; j <5-i; j++) {
System.out.print(" ");
}
//打印*号
for (int k = 0; k <2*i-1 ; k++) {
System.out.print("*");
}
System.out.println();
}
4.打印菱形
// 上半部分
for (int i = 0; i <5 ; i++) {
System.out.print(" ");
//打印空格
for (int j = 0; j <5-i; j++) {
System.out.print(" ");
}
//打印*号
for (int k = 0; k <2*i-1 ; k++) {
System.out.print("*");
}
System.out.println();
}
//下半部分
for (int i = 0; i <5 ; i++) {
System.out.print(" ");
//打印空格
for (int j = 0; j <i; j++) {
System.out.print(" ");
}
//打印*号
for (int k = 0; k <9-2*i; k++) {
System.out.print("*");
}
System.out.println();
}
5.打印空心菱形
//上半部分
for (int i = 1; i <= 5; i++) {
//每一行的空格数
for (int j = 1; j <=5-i ; j++) {
System.out.print(" ");
}
//每一行的*
for (int j = 1; j <=2*i-1 ; j++) {
if(j==1||j==2*i-1){
System.out.print("* ");
}else {
System.out.print(" ");
}
}
System.out.println();//换行
}
//下半部分
for (int i = 1; i <= 5; i++) {
//每一行的空格数
for (int j = 1; j <=i ; j++) {
System.out.print(" ");
}
//每一行的*
for (int j = 1; j <=9-2*i ; j++) {
if(j==1||j==9-2*i){
System.out.print("* ");
}else {
System.out.print(" ");
}
}
System.out.println();//换行
}
九九乘法表
//实现99乘法表的打印和输出。
for (int i =1; i <=9 ; i++) {
for (int j =1; j <=i; j++) {
System.out.print(i+"*"+j+"="+i*j+"\t");
}
System.out.println();
}
}
求数组中的最大值与最小值
//开发部有15名员工,编写一个程序,
// 用于接收每个员工的年龄,计算并输出开发部员工的平均年龄,
// 最大年龄及最小年龄。
int[] arrage=new int[15];
Scanner sc=new Scanner(System.in);
int sum=0;
int max;
int min;
for (int i = 0; i <arrage.length; i++) {
System.out.println("请输入第"+(i+1)+"名员工的年龄:");
arrage[i]=sc.nextInt();
sum+=arrage[i];
}
System.out.println("开发部15名员工的平均年龄为:"+sum/15);
for (int i = 0; i <arrage.length ; i++) {
max=arrage[0];//初始化,假设第一个是最大的
min=arrage[0];//初始化,假设第一个是最小的
if (arrage[i]>max){
max=arrage[i];
}
if (arrage[i]<min){
min=arrage[i];
}
if (i==arrage.length-1){
System.out.println("最大年龄为:"+max);
System.out.println("最小年龄为:"+min);
}
}
数组中的部分算法
我们存储在数组中的数据有时是无序的,看起来很麻烦,查找元素相对有序的数组要慢很多,所以就有了一些经典的算法,比如冒泡排序,选择排序等等,排完序后查找元素如果一个个遍历效率就会很低,于是就有了二分查找这个算法,我们一起来回顾一下。
冒泡排序
1.排序的原理
冒泡排序可以理解为轻的上浮,重的下沉。下面我举一个例子,有一组数据为:5,2,4,3,1,从第一个数开始比较,若后面的数比前面的数小就交换位置,具体比较过程如下:
第一轮
比较的数 | 交换后 |
---|---|
5和2 | 2,5,4,3,1 |
5和4 | 2,4,5,3,1 |
5和3 | 2,4,3,5,1 |
5和1 | 2,4,3,1,5 |
此轮过后已经确定了一个位置,下一轮的比较次数可以减少一次
第二轮
比较的数 | 交换后 |
---|---|
2和4 | 2,4,3,1,5 |
4和3 | 2,3,4,1,5 |
4和1 | 2,3,1,4,5 |
此轮过后已经确定了两个位置,下一轮的比较次数可以减少一次
第三轮
比较的数 | 交换后 |
---|---|
2和3 | 2,3,1,4,5 |
3和1 | 2,1,3,4,5 |
此轮过后已经确定了三个位置,下一轮的比较次数可以减少一次
第四轮
比较的数 | 交换后 |
---|---|
2和1 | 1,2,3,4,5 |
此轮过后已经确定了第四个和第五个位置,比较结束
2.具体的代码实现
//冒泡排序
int[] arry={5,2,4,3,1};
System.out.print("排序前的数组为:");
for (int i = 0; i <arry.length ; i++) {
System.out.print(arry[i]+"\t ");
}
for (int i = 0; i <arry.length-1 ; i++) {
for (int j = 0; j <arry.length-1-i ; j++) {
if (arry[j]>arry[j+1]){
int temp=arry[j];
arry[j]=arry[j+1];
arry[j+1]=temp;
}
}
}
System.out.println();
System.out.print("排序后的数组为:");
for (int s:arry) {
System.out.print(s+"\t ");
}
选择排序
1.排序的原理
选择排序的原理是默认每 i 轮的最小值为a[i],如果未排序的元素中有比a[i]的值小的,那么要记录下最下值的位置,每轮比较完成后再交换位置,然后再继续比较。还是用上面的例子,有一组数据:5,2,4,3,1,具体的比较过程如下表:
第一轮默认下标为0的是最小值
比较的数 | 最小值下标 |
---|---|
5和2 | 1 |
2和4 | 1 |
2和3 | 1 |
2和1 | 4 |
交换后的数据为:1,2,4,3,5
第二轮默认下标为1的是最小值
比较的数 | 最小值下标 |
---|---|
2和4 | 1 |
2和3 | 1 |
2和5 | 1 |
次轮不交换
第三轮默认下标为2的是最小值
比较的数 | 最小值下标 |
---|---|
4和3 | 3 |
3和5 | 3 |
交换后的数据为:1,2,3,4,5
第四轮默认下标为3的是最小值
比较的数 | 最小值下标 |
---|---|
4和5 | 3 |
交换后的数据为:1,2,3,4,5
2.具体的代码实现
//选择排序
//1.定义数组
int[] arry={5,2,4,3,1};
//2.确定数组中最小的值的位置
for (int i = 0; i <arry.length-1; i++) {//轮数
int index=i;
for (int j = i; j <=arry.length-1; j++) {
if (arry[j]<arry[index]){
index=j;
}
}
//3.比较完后交换最小值的位置
int temp=arry[i];
arry[i]=arry[index];
arry[index]=temp;
}
for (int m:arry) {
System.out.print(m+"\t");
}
二分查找
1.查找原理
二分查找就是先对半分割,再进行比较,如果要找的数字比中间值大就在右边找,相反的,就在左边查找。依次类推,最后找到要查找的元素,不过前提是数组中的元素必须要是有序的,不然二分查找就毫无意义。以一组有序的数据为例:1,2,3,4,5,6 ;假设我要找的数字是5,用二分法的具体过程如下:
左区间下标 | 中间值下标 | 右区间下标 |
---|---|---|
0 | 2 | 5 |
3 | 4 | 5 |
2.具体的代码实现
int[] arry={5,2,1,3,4,6};
Arrays.sort(arry);
System.out.println("升序后的数组为:");
for (int s:arry) {
System.out.print(s+"\t");
}
System.out.println();
//2.二分查找,定义中间变量,确定每次比较的范围
int low=0;
int height=arry.length-1;
int mid;
boolean isFind=false;
Scanner sc=new Scanner(System.in);
System.out.println("请输入你要查找的数字:");
int usernum=sc.nextInt();
while (low<=height){//左区间与右区间重合时结束循环
mid=(low+height)/2;
if (usernum==arry[mid]){
System.out.println(usernum+"的位置在第"+(mid+1)+"个");
isFind=true;
break;
}
if (usernum>arry[mid]){
low=mid+1;
}if (usernum<arry[mid]){
height=mid-1;
}
}
if (!isFind){
System.out.println("您要查找的数字没有找到!");
}
二维数组
二维数组与一维数组类似,也是固定类型和固定长度的一组数据,下面进行一些简单的回顾。
二维数组的定义
1.第一种方式
int[][] array=new int[2][3];//表示包含2个长度为3的一维数组
2.第二种方式
int[][] array2=new int[][]{{1,2,3},{4,5,6},{7,8,9}};
3.第三种方式
int[][] array3={{1,2,3},{4,5,6},{7,8,9}};
二维数组的应用
杨辉三角
int[][] YangHui=new int[10][10];
for (int i = 0; i <YangHui.length ; i++) {
YangHui[i]=new int[i+1];//
YangHui[i][0]=1;//确定每行的第一个数值是1
YangHui[i][i]=1;//确定每行的最后一个数值是1
if (i>1){
for (int j = 1; j <YangHui[i].length-1; j++) {
YangHui[i][j]=YangHui[i-1][j-1]+YangHui[i-1][j];//从第二行开始,除了首尾,每个元素的值等于上一行的前一个数加上上一行的同等位置的数
}
}
}
本节的回顾到这里就告一段落,别走开,未完待续…