第六章 数组
一维数组
数据的作用和类型
- 作用
- 存储相同数据类型的一组数据。
- 对同类型数据进行集中管理。比如存储和遍历。
- 数组类型
- 数组的类型就是数组中存储的数据的类型
- 要点
- 数组中的所有元素必须属于相同的数据类型
- 数组中所有元素在内存中连续存储
- 特点
- 数组本身也是一种引用类型
声明、创建数组
- 数组的声明
- 告诉系统数据类型是什么
- 语法:
数据类型[ ] 数组名;
- 数组的创建
- 为数组分配内存空间
- new操作符的使用
-
声明并创建数组
数据类型[ ] 数组名 = new 数据类型[大小];
-
数组特点
- 数组有一个字段length,表示此数组对象可以存储多少元素即数组长度;length不是实际保存的元素个数。
- “ [ ] ” 语法是访问数组对象成员的唯一方式。
- 对象数组保存的是引用,基本类型数组直接保存基本类型的值。
- 新生成的数组对象,其中所有的引用自动初始化为null;基本类型数组成员有各自默认值(数值型自动初始化为0,字符型为(char)0,布尔型为false )。
初始化数组
- 为数组中的成员——赋值
- 数组中赋值的两种方式
- 方法1:边声明边赋值(静态初始化)
int[ ] score = {66,77,88} ;
int[ ] score = {66,77,88} ;
- 方法2:动态地获取(从键盘录入)信息并赋值
- 方法1:边声明边赋值(静态初始化)
- 数组中赋值的两种方式
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。
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);
}
}