05数组.docx

上传人:b****3 文档编号:4662076 上传时间:2022-12-07 格式:DOCX 页数:21 大小:151.15KB
下载 相关 举报
05数组.docx_第1页
第1页 / 共21页
05数组.docx_第2页
第2页 / 共21页
05数组.docx_第3页
第3页 / 共21页
05数组.docx_第4页
第4页 / 共21页
05数组.docx_第5页
第5页 / 共21页
点击查看更多>>
下载资源
资源描述

05数组.docx

《05数组.docx》由会员分享,可在线阅读,更多相关《05数组.docx(21页珍藏版)》请在冰豆网上搜索。

05数组.docx

05数组

1.纲要

a)数组概要

b)一维数组的声明和使用

c)二维数据的声明和使用

d)数组的排序

e)数组的查找

f)Arrays工具类

2.内容

2.1、数组概要

数组是一种引用数据类型,在内存中存储示意图如下:

1.数组是一组数据的集合

2.数组作为一种引用类型

3.数组元素的类型可以是基本类型,也可以是引用类型,但同一个数组只能是同一种类型

4.数组作为对象,数组中的元素作为对象的属性,除此之外数组还包括一个成员属性length,length表示数组的长度

5.数组的长度在数组对象创建后就确定了,就无法再修改了

6.数组元素是有下标的,下标从0开始,也就是第一个元素的下标为0,依次类推最后一个元素的下标为n-1,我们可以通过数组的下标来访问数组的元素

2.2、一维数组的声明和使用

2.2.1、数组的声明

一维数组的声明格式有以下两种:

1.数组元素的类型[]变量名称

2.数组元素的类型变量名称[]

数组元素的类型,可以是java中的任意类型,变量名称可以是任意合法的标识符,上面两种格式较常用的是第一种,例如:

int[]a;

Student[]stu

在一行中也可以声明多个数组,例如:

int[]a,b,c

2.2.2、数组的创建

数组有两种创建方式

●第一种,使用new操作符来创建数组,格式为:

new数组元素的数据类型[数组元素的个数]

1.基本类型的数组

publicclassArrayTest01{

publicstaticvoidmain(String[]args){

//声明int类型的数组,长度为5

//数组中的元素必须为int类型

int[]data=newint[5];

//对数组中的元素进行赋值,如果不赋值默认为该类型的默认值,以上数组默认为0

//如何赋值?

变量名[下标],下标从0开始

data[0]=1;

data[1]=2;

data[2]=3;

data[3]=4;

data[4]=5;

//输出数组中的元素,变量名[下标]

System.out.println(data[0]);

System.out.println(data[1]);

System.out.println(data[2]);

System.out.println(data[3]);

System.out.println(data[4]);

System.out.println("-----------------------");

//采用length属性可以取得数组的长度

for(inti=0;i

System.out.println(data[i]);

}

//输出指定的数组元素

System.out.println("data[3]="+data[3]);

//会抛出ArrayIndexOutOfBoundsException异常

//数组下标越界

System.out.println("data[10]="+data[10]);

//不能成功赋值,数组中的类型必须是一种类型

//data[0]="iiii";

}

}

内存结构

int[]data=newint[5];

data[0]=1;

data[1]=2;

data[2]=3;

data[3]=4;

data[4]=5;

必须清楚数组为引用类型,它在堆中分配

2.引用类型的数组

【示例代码】

publicclassArrayTest02{

publicstaticvoidmain(String[]args){

//声明引用类型的数组

Student[]student=newStudent[2];

//出现空指针

//因为引用类型的数组,它采用null作为默认的初始化值

student[0].id=1001;

student[0].name="张三";

student[1].id=1002;

student[1].name="李四";

}

}

classStudent{

intid;

Stringname;

}

修正空指针

publicclassArrayTest03{

publicstaticvoidmain(String[]args){

//声明引用类型的数组

Student[]student=newStudent[2];

//初始数组元素为Student对象

/*

student[0]=newStudent();

student[0].id=1001;

student[0].name="张三";

student[1]=newStudent();

student[1].id=1002;

student[1].name="李四";

*/

//可以采用如下方式赋值

Studentzhangsan=newStudent();

zhangsan.id=1001;

zhangsan.name="张三";

student[0]=zhangsan;

Studentlisi=newStudent();

lisi.id=1002;

lisi.name="李四";

student[1]=lisi;

for(inti=0;i

System.out.println("id="+student[i].id+",name="+student[i].name);

}

}

}

classStudent{

intid;

Stringname;

}

Student[]student=newStudent[2];

Studentzhangsan=newStudent();

zhangsan.id=1001;

zhangsan.name="张三";

student[0]=zhangsan;

Studentlisi=newStudent();

lisi.id=1002;

lisi.name="李四";

student[1]=lisi;

●第二种,使用数组的初始化语句,格式为:

数组元素的类型[]变量名称={数组元素1,数组元素2,......数组元素n}或数组元素的类型变量名称[]={数组元素1,数组元素2,......数组元素n}

publicclassArrayTest04{

publicstaticvoidmain(String[]args){

//静态初始化

int[]data={1,2,3,4,5};

for(inti=0;i

System.out.println(data[i]);

}

Studentzhangsan=newStudent();

zhangsan.id=1001;

zhangsan.name="张三";

Studentlisi=newStudent();

lisi.id=1002;

lisi.name="李四";

//静态初始化

Student[]students={zhangsan,lisi};

for(inti=0;i

System.out.println("id="+students[i].id+",name="+students[i].name);

}

}

}

classStudent{

intid;

Stringname;

}

2.3、二维数组的声明和使用

1

2

3

4

5

6

二维数组属于多维数组,那么什么是多维数组呢,当数组元素的类型是数组时就成了多维数组,二维数组的声明格式如下:

1.数组元素的数据类型[][]变量名;

2.数组元素的数据类型变量名[][];

其中方括号的个数就是数组的维数,声明二维数组如下:

int[][]data;

在这里介绍三种二维数组的创建方式

1.采用new关键字直接创建

publicclassArrayTest05{

publicstaticvoidmain(String[]args){

//声明二维数组

int[][]data=newint[2][3];

//对二维数组赋值

data[0][0]=1;

data[0][1]=2;

data[0][2]=3;

data[1][0]=4;

data[1][1]=5;

data[1][2]=6;

//输出二维数组

for(inti=0;i

for(intj=0;j

System.out.println(data[i][j]);

}

}

}

}

int[][]data=newint[2][3];

//对二维数组赋值

data[0][0]=1;

data[0][1]=2;

data[0][2]=3;

data[1][0]=4;

data[1][1]=5;

data[1][2]=6;

2.从高维开始逐维创建

publicclassArrayTest06{

publicstaticvoidmain(String[]args){

//从高维开始逐维创建

int[][]data=newint[2][];

data[0]=newint[2];

data[1]=newint[4];

data[0][0]=1;

data[0][1]=2;

data[1][0]=1;

data[1][1]=2;

data[1][2]=3;

data[1][3]=4;

//输出二维数组

for(inti=0;i

for(intj=0;j

System.out.println(data[i][j]);

}

}

}

}

3.采用初始化语句块创建数组对象

publicclassArrayTest07{

publicstaticvoidmain(String[]args){

//静态初始化

int[][]data={{1,2},{1,2,3,4}};

for(inti=0;i

for(intj=0;j

System.out.println(data[i][j]);

}

}

}

}

2.4、数组的排序

2.4.1、冒泡排序

假设有5个数字3,1,6,2,5在一个int数组中,要求按从小到大排序输出

如何采用冒泡排序算法呢?

冒泡排序的算法是这样的,首先从数组的最左边开始,取出第0号位置(左边)的数据和第1号位置(右边)的数据,如果左边的数据大于右边的数据,则进行交换,否而不进行交换。

接下来右移一个位置,取出第1个位置的数据和第2个位置的数据,进行比较,如果左边的数据大于右边的数据,则进行交换,否而不进行交换。

沿着这个算法一直排序下去,最大的数就会冒出水面,这就是冒泡排序。

以上示例排序过程如下:

第一遍排序

3

1

6

2

5

1

3

6

2

5

1

3

6

2

5

1

3

2

6

5

1

3

2

5

6

从上面我们看到了比较了N-1次,那么第二遍就为N-2次比较了,如此类推,比较次数的公式如下:

(N-1)+(N-2)+...+1=((N-1)*N)/2

所以以上总共比较次数为((5-1)*5)/2=10

以上就是冒泡排序算法

publicclassArraySortTest01{

publicstaticvoidmain(String[]args){

int[]data={3,1,6,2,5};

for(inti=data.length-1;i>0;i--){

for(intj=0;j

if(data[j]>data[j+1]){

inttemp=data[j];

data[j]=data[j+1];

data[j+1]=temp;

}

}

}

for(inti=0;i

System.out.println(data[i]);

}

}

}

2.4.2、选择排序

选择排序对冒泡排序进行了改进,使交换次数减少,但比较次数仍然没有减少。

假设有5个数字3,1,6,2,5在一个int数组中,要求按从小到大排序输出

采用选择排序,选择排序是这样的,先从左端开始,找到下标为0的元素,然后和后面的元素依次比较,如果找到了比下标0小的元素,那么再使用此元素,再接着依次比较,直到比较完成所有的元素,最后把最小的和第0个位置交换。

以上示例排序过程如下:

第一遍排序

3

1

6

2

5

3

1

6

2

5

3

1

6

2

5

3

1

6

2

5

1

3

6

2

5

第二遍排序将从下标为1的元素开始,以此类推,经过N(N-1)/2次比较,经过N次数据交互就完成了所有元素的排序。

【示例代码】

publicclassArraySortTest02{

publicstaticvoidmain(String[]args){

int[]data={3,1,6,2,5};

for(inti=0;i

intmin=i;

for(intj=i+1;j

if(data[j]

min=j;

}

}

//进行位置的交换

if(min!

=i){

inttemp=data[i];

data[i]=data[min];

data[min]=temp;

}

}

for(inti=0;i

System.out.println(data[i]);

}

}

}

2.5、数组的搜索

2.5.1、二分法(折半法)查找

查找数组中的元素我们可以遍历数组中的所有元素,这种方式称为线性查找。

线性查找适合与小型数组,大型数组效率太低。

如果一个数组已经排好序,那么我们可以采用效率比较高的二分查找或叫折半查找算法。

见示例

数值

11

12

13

14

15

16

17

18

19

20

下标

0

1

2

3

4

5

6

7

8

9

假设,我们准备采用二分法取得18在数组中的位置

●第一步,首先取得数组0~9的中间元素

中间元素的位置为:

(开始下标0+结束下标9)/2=下标4

通过下标4取得对应的值15

18大于15,那么我们在后半部分查找

●第二步,取数组4~9的中间元素

4~9的中间元素=(下标4+1+下标9)/2=下标7

下标7的值为18,查找完毕,将下标7返回即可

以上就是二分或折半查找法,此种方法必须保证数组事先是排好序的,这一点一定要注意

【示例代码】

publicclassBinarySearchTest01{

publicstaticvoidmain(String[]args){

int[]data={11,12,13,14,15,16,17,18,19,20};

intindex=binarySearch(data,18);

System.out.println(index);

}

//采用折半法查询,必须建立在排序的基础上

privatestaticintbinarySearch(int[]data,intvalue){

//开始下标

intbeginPos=0;

//结束下标

intendPos=data.length-1;

while(beginPos<=endPos){

intmidPos=(beginPos+endPos)/2;

if(value==data[midPos]){

returnmidPos;

}elseif(value>data[midPos]){

beginPos=midPos+1;

}elseif(value

endPos=midPos-1;

}

}

return-1;

}

}

2.6、Arrays工具类

了解sort、fill和binarySearch

2.6.1、Arrays.sort的使用

importjava.util.Arrays;

publicclassArraysUtilTest01{

publicstaticvoidmain(String[]args){

int[]data={3,1,6,2,5};

Arrays.sort(data);

for(inti=0;i

System.out.println(data[i]);

}

System.out.println("----------------");

for(inti=data.length-1;i>=0;i--){

System.out.println(data[i]);

}

}

}

2.6.2、Arrays.binarySearch的使用

importjava.util.Arrays;

publicclassArraysUtilTest02{

publicstaticvoidmain(String[]args){

int[]data={3,1,6,2,5};

Arrays.sort(data);

for(inti=0;i

System.out.println(data[i]);

}

System.out.println("");

intindex=Arrays.binarySearch(data,3);

System.out.println("index="+index);

}

}

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 初中教育 > 语文

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1