06 Java语言基础语法 - 7

第六章 数组

一维数组

数据的作用和类型

  1. 作用
  • 存储相同数据类型的一组数据。
  • 对同类型数据进行集中管理。比如存储和遍历。
  1. 数组类型
  • 数组的类型就是数组中存储的数据的类型
  1. 要点
  • 数组中的所有元素必须属于相同的数据类型
  • 数组中所有元素在内存中连续存储
  1. 特点
  • 数组本身也是一种引用类型

声明、创建数组

  1. 数组的声明
  • 告诉系统数据类型是什么
  • 语法: 数据类型[ ] 数组名;
  1. 数组的创建
  • 为数组分配内存空间
    • new操作符的使用
  1. 声明并创建数组
    数据类型[ ] 数组名 = new 数据类型[大小];

  2. 数组特点

  • 数组有一个字段length,表示此数组对象可以存储多少元素即数组长度;length不是实际保存的元素个数。
  • “ [ ] ” 语法是访问数组对象成员的唯一方式。
  • 对象数组保存的是引用,基本类型数组直接保存基本类型的值。
  • 新生成的数组对象,其中所有的引用自动初始化为null;基本类型数组成员有各自默认值(数值型自动初始化为0,字符型为(char)0,布尔型为false )。

初始化数组

  • 为数组中的成员——赋值
    • 数组中赋值的两种方式
      • 方法1:边声明边赋值(静态初始化)
        int[ ] score = {66,77,88} ;
        int[ ] score = {66,77,88} ;
      • 方法2:动态地获取(从键盘录入)信息并赋值
int[] score = new int[3];
Scanner input = new Scanner(System.in);
for(int i=0;i<3;i++){
	score[i]=input.nextInt();
}
import java.util.Scanner;
public class ArrayDemo1{
	public static void main(String[] args){
		//先声明,后创建
		int [] array;
		array=new int[3];
		System.out.println(array.length);
		System.out.println(array[0]);

		//int []array = new int[3];
		//System.out.println(array.length);
		//System.out.println(array[0]);
		System.out.println("===========================");

		//对数组中的元素进行赋值,通过下标进行赋值
		array[0]=1;
		array[2]=3;
		// array[3]=10;  //数组越界
		System.out.println(array[0]);
		System.out.println(array[1]);
		System.out.println(array[2]);
		System.out.println("===========================");

		//通过for循环进行统一遍历
		for (int i=0; i<array.length; i++){
			System.out.println(array[i]);
		}

		//创建数组的同时做初始化
		int [] array1={10,20,30};
		// int [] array=new int [] {10,20,30}; (初始化)
		for (int i=0; i<array1.length; i++){
			System.out.println(array1[i]);
		}
		System.out.println("===========================");

		int [] array2 = new int [3];
		Scanner input=new Scanner(System.in);
		for (int i=0; i<array2.length; i++) {
			array2[i]=input.nextInt();
		}
		for (int i=0; i<array2.length; i++) {
			System.out.println(array2[i]);
		}
		System.out.println("===========================");
	}
}

常用数组排序算法:数组的访问

直接输出数组名,显示的是数组的地址 [I@75412c2f
索引(index):每一个存储到数组的元素,都会自动的拥有一个编号,从0开始,这个自动编号称为数组索引(index) ,可以通过数组的索引访问到数组中的元素。
在这里插入图片描述
通过索引(index)访问数组中的元素:

  • 数组名[索引],获取出数组中的元素
  • 数组名[索引] = 数值,为数组中的元素赋值
    ————————————————
    版权声明:本文为CSDN博主「罗俊-Everns」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
    原文链接:https://blog.csdn.net/Luojun13Class/article/details/83020011

常用数组查找算法

  1. 线性查找法
    工作原理:它又称为顺序查找。在一列给定的值中进行搜索,从一端开始逐一检查每个元素,直到找到所需元素的过程。
  • 查找指定的数在数组中出现的位置,找到返回下标,找不到返回-1。
public class LinearSearch{
	public static void main(String[] args){
		int [] array={10,100,80,50,70,60,90};
		System.out.println("请输入要查找的数");
		Scanner input = new Scanner(System.in);
		int number=input.nextInt();
		int index=-1;	//保存找到数所在数组中的下标,找不到等于-1
		for(int i=0; i<array.length; i++){
			if(array[i]==number){
				index=i+1;
				break;
			}
		}
		if(index!=-1){
			System.out.println("找到,在数组中的第"+index+"个位置");
		}else{
			System.out.println("你要查找的数不存在");
		}
	}
}
  • 求数组中的最大值,最小值。
public class MaxMinDemo{
	public static void main(String[] args){
		int [] array = {10,100,80,50,70,60,90};
		int max=array[0];		//最大值
		int min=array[0];		//最小值
		for(int i=1;i<array.length;i++){
			if(array[i]>max){
				max=array[i];
			}
			if(array[i]<min){
				min=array[i];
			}
		}
		System.out.println("最大值为:"+max);
		System.out.println("最小值为:"+min);
	}
}
  • 二分法查找:
    工作原理: 它又称为半查找法。将数组中间位置记录的关键字与查找关键字比较,如果两者相等,则查找成功;否则利用中间位置记录将数组分成前、后两个子数组,如果中间位置记录的关键字大于查找关键字,则进一步查找前一子数组,否则进一步查找后一子数组。重复以上过程,直到找到或找不到为止。
public class BinarySearch{
	public static void main(String[] args){
		int [] array={1,2,3,4,5,7,9,13,14,18};
		System.out.println("请输入要查找的数");
		Sccanner input = new Scanner(System.in);
		int number=input.nextInt();
		int index=-1;			//保存找到数所在数组中的下标,找不到等于-1
		int start=0;			//起始下标
		int end=array.length-1;	//终止下标
		while(start<=end){
			//找到中间下标所对应的元素值
			middle=(start+end)/2;
			if(number==array[middle]){
				index=middle+1;
				break;
			}

			if(number>array[middle]){
			}
		}
	}
}

冒泡排序法
工作原理:比较相邻的元素。如果第一个比第二个大,就交换它们两个。对每一个相邻元素作同样的工作,从开始第一对到结尾的最后一对。最后的元素应该会是最大的数。针对除了最后一个元素以外所有的元素重复以上的步骤。直到没有任何一对数字需要比较。

public class BubbleSort{
	public static void main(String[] args){
		int [] array={1,5,3,2,6,7,9,13,54,20};
		//N个数比较的轮数为N-1
		for(int i=0;i<array.length-1;i++){
			//每一轮比较的次数为N-1-i;
			for(int j=0;j<array.length-1-i;j++){
				//比较相邻的两个数,小靠前
				if(array[j]>array[j+1]){
					//两个数做交换,通过设置临时变量
					int temp=array[j];
					array[j]=array[j+1];
					array[j+1]=temp;
				}
			}
		}
		//把排好序的数组输出
		for(int i=0;i<array.length;i++){
			System.out.print(array[i]+" ");
		}
	}
}

选择排序法
工作原理:首先在未排序序列中找到最小元素,存放到排序序列的起始位置,然后,再从剩余未排序元素中继续寻找最小元素,然后放到排序序列末尾。以此类推,直到所有元素均排序完毕。

public class SelectSort{
	public static void(String[] args){
		int [] array={1,5,3,2,6,7,9,13,54,20};
		int min=0;		//保存最元素值的下标
		for(int i=0;i<array.length-1;i++){
			min=i;
			for(int j=i+1;j<array.length;j++){
				if (array[min]>array[j]) {
					min=j;
					//查找最小数在数组中的下标
				}	
			}
			//如果第i个最小的数位置不在i上,则进行交换
			if(i!=min){
				int temp=array[i];
				array[i]=array[min];
				array[min]=temp;
			}
		}
		for(int i=0;i<array.length;i++){
			System.out.print(array[i]+" ");
		}
	}
}

插入排序法
工作原理:它是通过构建有序序列,对于未排序数据,在已排序序列中从后向前扫描,找到相应位置并插入。从后向前扫描过程中,需要反复把已排序元素逐步向后挪位,为最新元素提供插入空间。

public class InsertSort{
	public static void main(String[] args) {
		int [] array={20,25,15,42,36,16,12};
		for(int i=1;i<array.length;i++){
			int temp=array[i];
			//把下标保存起来
			int j=i;
			while (j>0&&temp<array[j-1]) {
				//上面的数覆盖其下面的数
				array[j]=array[j-1];
				j--;
			}
			array[j]=temp;//插入数据
		}
		for(int i=0;i<array.length;i++){
			System.out.print(array[i]+" ");
		}
	}
}

Arrays类的使用

Java的jdk中提供了一个Arrays工具类,此类专门为程序员操作数组提供了很多专有方法,通过方法的调用可以对数组进行赋值、排序、比较、查找元素等功能。

百度云地址
链接: https://pan.baidu.com/s/1cp5ethL-l-EqJmyNERTEPw
提取码:k6wm

CSDN地址
https://download.csdn.net/download/weixin_44624117/11816565

public class ArrayUtilDemo{
	public static void main(String[] args){
		int [] arraySrc1={1,3,4,5,6,2};
		int [] arrayDes1=Arrays.copyOf(arraySrc1,10);
		for (int i=0;i<arrayDes1.length;i++){
			System.out.print(arrayDes1[i]+" ");
		}
		System.out.println("\n **************************************");
		//拷贝指定数组中的指定范围内的数据
		int [] arrayDes2=Arrays.copyOfRange(arraySrc1,2,4);
		for (int i=0;i<arrayDes2.length;i++) {
			System.out.print(arrayDes1[i]+" ");
		}
		//数组的比较
		System.out.println("\n **************************************");
		int [] arraySrc2={1,3,4,5,6,1};
		boolean flag=Arrays.equals(arraySrc1,arraySrc2);
		System.out.println(flag);
		//数组填充
		System.out.println("\n **************************************");
		int [] arrayDes3=new int[10];
		Arrays.fill(arrayDes3,10);
		Arrays.fill(arrayDes3,1,5,10);
		for(int i=0;i<arrayDes3.length;i++){
			System.out.print(arrayDes3[i]+" ");
		}
		//对数组进行排序
		System.out.println("\n **************************************");
		Arrays.sort(arraySrc1);
		for(int i=0;i<arraySrc1.length;i++){
			System.out.print(arraySrc1[i]+" ");
		}
		//二分法查找
		System.out.println("\n **************************************");
		int index=Arrays.binarySearch(arraySrc1,10);
		System.out.println(index);
		//使用System这个类的方法来拷贝数组
		int [] arrayDes5=new int[10];
		System.arrayCopy(arraySrc1,0,arrayDes5,2,5);
		for (int i=0;i<arrayDes5.length;i++) {
			System.out.print(arraySrc1[i]+" ");
		}		
	}
}

如果想直接在声明时就对数组赋初值,可以利用大括号完成。
只要在数组的声明格式后面再加上初值的赋值即可,如下面的格式。
数据类型 数组名[]={初值0,初值1,~~~,初值n}

int day[]={32,23,45,22,13,45,78,96,43,32}; //数组声明并赋初值
语句中声明了一个整型数组day,虽然没有特别指明数组的长度,
但是由于大括号里的初值有10个,所以编译器会分别依序指定给各元素存放,day[0]=32,~~,day[9]=32。

System.arraycopy(source,0,dest,0,x)
语句的意思是:复制源数组从下标0开始的x个元素到目标数组,从目标数组的下标0所对应的位置开始存取。

数组的排序
Array.sort(数组名)为数组排序的操作,但这个方法在java.util.*包里面,所以使用的时候需要先将它导入。

import java.util.*;
public class Test{
	public static void main(String[] args){
		int a[]={4,72,45,22,65,12,2};
		
		System.out.print("数组排序前的顺序:");
		for(int i=0;i<a.length;i++){
			System.out.print(a[i]+"  ");
		}
		Arrays.sort(a);			//数组的排序方法
		
		System.out.print("\n数组排序后的顺序:");
		for(int i=0;i<a.length;i++){
			System.out.print(a[i]+"  ");
		}	
	}
}

二维数组

二维数组的声明与分配内存
二维数组声明的方式和一维数组类似,内存的分配也一样是用new这个关键字。其声明与分配内存的格式如下。

数据类型 数组名[ ][ ];
数组名 = new 数据类型[行的个数][列的个数];

较为简洁的方式声明数组:
数据类型 数组名[][] = new 数据类型[行的个数][列的个数];

如果想直接在声明时就对数组赋初值,可以利用大括号完成。只要在数组的声明格式后面再加上所赋初值即可。

数据类型 数组名[][]={
	{0行初值},
	{1行初值},
	{2行初值},
	  ~~~ ~~~
	{第n行初值},
};

int num[][]={
	{23,45,21,45},
	{45,23,46,23}
};

取得二维数组的行数与特定行的元素的个数
在二维数组中,若想取得整个数组的行数,或者是某行元素的个数,
则可利用“.length”来获取。其语法如下。
数组名.length //取得数组的行数
数组名[行的索引].length //取得特定行元素的个数

Java允许二维数组中每行元素个数均不相同,这点与一般的程序语言不同。
例如:下面语句是声明整型数组num并赋初始值,而初值的赋值指明了num具有三行元素,
其中第一行有4个元素,第二行有3个元素,第三行有5个元素。

int num[][]={
	{42,54,34,67},
	{33,34,56},
	{12,34,56,78,90}
};

".length"的运用:
二维数组中,取得整个数组的行数,或是某行元素的个数,用".length"来获取。
数组名.length // 取得数组的行数
数组名[行的索引].length // 取得特定行元素的个数
要取得二维数组的行数,需要用数组名加上".length"即可;
如果取得数组中特定行的元素的个数,则需在数组后面加上该行的索引值,再加上".length"。

num.length;				// 计算数组num的行数,其值为3
num[0].length;			// 计算数组num的第一行的个数,其值为4
num[2].length;			// 计算数组num的第三行元素的个数,其值为5
public class Test{
	public static void main(String[] args){
		int i,j,sum=0;
		int num[][]={{30,35,26,32},{33,34,30,29}};		//声明数组并设置初值
		for(i=0;i<num.length;i++){
			System.out.print("第"+(i+1)+"个人的成绩为:");
			for(j=0;j<num[i].length;j++){
				System.out.print(num[i][j]+" ");
				sum+=num[i][j];
			}
			System.out.println();
		}
		System.out.println("总成绩是"+sum);
	}
}

三维数组

public class Test{
	public static void main(String[] args){
		int i,j,k,sum=0;
		int A[][][]={{{5,1},{6,7}},{{9,4},{8,3}}};		//声明数组并设置初值

		// 三维数组的输出需要采用三层for循环方式输出
		for(i=0;i<A.length;i++){
			for(j=0;j<A[i].length;j++){
				for(k=0;k<A[i][j].length;k++){
					System.out.print("A["+i+"]["+j+"]["+k+"]="+A[i][j][k]+"\n");
					sum+=A[i][j][k];
				}
			}
		}
		System.out.println("总成绩是"+sum);
	}
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值