數(shù)組與字符串_第1頁
數(shù)組與字符串_第2頁
數(shù)組與字符串_第3頁
數(shù)組與字符串_第4頁
數(shù)組與字符串_第5頁
已閱讀5頁,還剩55頁未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡介

第5章數(shù)組與字符串1通過本章的學(xué)習(xí),主要掌握以下知識點(diǎn):數(shù)組的基本概念數(shù)組元素的訪問棧內(nèi)存和堆內(nèi)存多維數(shù)組字符串本章的重點(diǎn):數(shù)組的定義與訪問本章的難點(diǎn):棧內(nèi)存和堆內(nèi)存多維數(shù)組的定義與應(yīng)用在程序設(shè)計(jì)中,數(shù)組是常用的數(shù)據(jù)結(jié)構(gòu)。無論是在面向?qū)ο蟮某绦蛟O(shè)計(jì)中,還是面向過程的程序設(shè)計(jì)中,數(shù)組都起著重要的作用。從數(shù)組的構(gòu)成形式上可以分為一維數(shù)組和多維數(shù)組。5.1數(shù)組的基本概念所謂數(shù)組就是相同數(shù)據(jù)類型的元素按一定順序排列的集合。在Java中數(shù)組元素可以由簡單數(shù)據(jù)類型的量組成,也可以由對象組成。數(shù)組中的每個(gè)元素都具有相同的數(shù)據(jù)類型,可以用一個(gè)統(tǒng)一的數(shù)組名和一個(gè)下標(biāo)來惟一地確定數(shù)組中的元素。

為了充分地理解數(shù)組的概念,首先介紹一下Java有關(guān)內(nèi)存分配的知識。Java把內(nèi)存分為兩種:棧內(nèi)存和堆內(nèi)存。在方法中定義的一些基本類型的變量和對象的引用變量都在方法的棧內(nèi)存中分配,當(dāng)在一段代碼塊中定義一個(gè)變量時(shí),Java就在棧內(nèi)存中為這個(gè)變量分配內(nèi)存空間,當(dāng)超出變量的作用域后,Java會自動(dòng)釋放掉為該變量所分配的內(nèi)存空間,該內(nèi)存空間可以立即被另作他用。堆內(nèi)存用來存放由new運(yùn)算符創(chuàng)建的對象和數(shù)組,在堆中分配的內(nèi)存,由Java虛擬機(jī)的自動(dòng)垃圾回收器來管理。在堆中創(chuàng)建了一個(gè)數(shù)組或?qū)ο蠛?,還可以在棧中定義一個(gè)特殊的變量,讓棧中的這個(gè)變量的取值等于數(shù)組或?qū)ο蟮脑诙褍?nèi)存中的首地址,棧中的這個(gè)變量就成了數(shù)組或?qū)ο蟮囊米兞浚米兞繉?shí)際上保存的是數(shù)組或?qū)ο笤趦?nèi)存中的地址(也稱為對象的句柄),以后就可以在程序中使用棧的引用變量來訪問堆中的數(shù)組或?qū)ο?。引用變量就相?dāng)于是為數(shù)組或?qū)ο笃鸬囊粋€(gè)名稱。總的來說,數(shù)組主要有如下幾個(gè)特點(diǎn)。

●數(shù)組是相同數(shù)據(jù)類型的元素的集合;

●數(shù)組中的各元素是有先后順序的,它們在內(nèi)存中按照這個(gè)先后順序連續(xù)存放在一起;

●數(shù)組元素用整個(gè)數(shù)組的名字和它自己在數(shù)組中的順序位置來表示。例如,a[0]表示名字為a的數(shù)組中的第一個(gè)元素,a[1]代表數(shù)組a的每二個(gè)元素,依次類推。一維數(shù)組是最簡單的數(shù)組,其邏輯結(jié)構(gòu)是線性表。要使用一維數(shù)組,需要經(jīng)過定義、初始化和應(yīng)用等過程。5.2一維數(shù)組5.2.1一維數(shù)組的定義在使用Java的數(shù)組,一般要經(jīng)過三個(gè)步驟:一是聲明數(shù)組,二是創(chuàng)建空間,三是創(chuàng)建數(shù)組元素并賦值。前兩個(gè)步驟的語法如下:數(shù)據(jù)類型[]數(shù)組名;//聲明一維數(shù)組數(shù)據(jù)類型數(shù)組名[];//聲明一維數(shù)數(shù)組名=new數(shù)據(jù)類型[個(gè)數(shù)];//分配內(nèi)存組數(shù)組數(shù)據(jù)類型[]數(shù)組名=new數(shù)據(jù)類型[個(gè)數(shù)];數(shù)組聲明之后,接下來便是要分配數(shù)組所需的內(nèi)存,這時(shí)必須用運(yùn)算符new,其中“個(gè)數(shù)”是告訴編譯器,所聲明的數(shù)組要存放多少個(gè)元素,所以“new”運(yùn)算符是通知編譯器根據(jù)括號里的個(gè)數(shù),在內(nèi)存中分配一塊空間供該數(shù)組使用。

下面舉例來說明數(shù)組的定義,如:int[]x;x=newint[10];在聲明數(shù)組時(shí),也可以將兩個(gè)語句合并成一行,格式如下:數(shù)據(jù)類型[]數(shù)組名=new數(shù)據(jù)類型[個(gè)數(shù)];如:Int[]x=newint[10];5.2.2一維數(shù)組元素的訪問要想使用數(shù)組里的元素,可以利用數(shù)組名和下標(biāo)來實(shí)現(xiàn)。數(shù)組元素的引用方式為:數(shù)組名[下標(biāo)]其中“下標(biāo)”可以是整型數(shù)或表達(dá)式。如a[3+i](i為整數(shù))。Java數(shù)組的下標(biāo)是從0開始的。如:int[]x=newint[10];其中x[0]代表數(shù)組中第1個(gè)元素,x[1]代表第2個(gè)元素,x[9]為第10個(gè)元素,也就是最后一個(gè)元素。X.length表示元素個(gè)數(shù)。

【例5.1】聲明一個(gè)一維數(shù)組,其長度為5,利用循環(huán)對數(shù)組元素進(jìn)行賦值,然后再利用另一個(gè)循環(huán)逆序輸出數(shù)組元素的內(nèi)容。程序代碼如下://app5_1.java一維數(shù)組publicclassapp5_1{publicstaticvoidmain(Stringargs[]){ inti; inta[];//聲明一個(gè)數(shù)組aa=newint[5];//分配內(nèi)存空間供整型數(shù)組a使用,其元素個(gè)數(shù)為5 for(i=0;i<5;i++)//對數(shù)組元素進(jìn)行賦值 a[i]=i; for(i=a.length-1;i>=0;i--)//逆序輸出數(shù)組的內(nèi)容 System.out.print(“a[”+i+”]=”+a[i]+”,\t”); System.out.println(“\n數(shù)組a的長度是:”+a.length);}}【例5.1】續(xù)該程序的運(yùn)行結(jié)果如下:a[4]=4,a[3]=3,a[2]=2,a[1]=1,a[0]=0數(shù)組a的長度是:5【例5.1】續(xù)5.2.3一維數(shù)組的初始化及應(yīng)用對數(shù)組元素的賦值,既可以使用單獨(dú)方式進(jìn)行(如上例),也可以在定義數(shù)組的同時(shí)就為數(shù)組元素分配空間并賦值,也稱為對數(shù)組的初始化。其格式如下:數(shù)據(jù)類型[]數(shù)組名={初值0,初值1,…,初值n};如:int[]a={1,2,3,4,5};int[5]a={1,2,3,4,5};//錯(cuò)誤!【例5.2】設(shè)數(shù)組中有n個(gè)互不相同的數(shù),不用排序求出其中的最大值和次最大值。//app5_2.java比較數(shù)組元素值的大小publicclassapp5_2{publicstaticvoidmain(Stringargs[]){inti,Max,Sec;inta[]={8,50,20,7,81,55,76,93};//聲明數(shù)組a,并賦初值if(a[0]>a[1]){Max=a[0];//Max存放最大值Sec=a[1];//Sec存放次最大值}else{Max=a[1];Sec=a[0];}System.out.print(“數(shù)組的各元素為:”+a[0]+”“+a[1]);for(i=2;i<a.length;i++){System.out.print(””+a[i]);//輸出數(shù)組a中的各元素if(a[i]>Max)//判斷最大值{Sec=Max;//原最大值降為次最大值Max=a[i];//a[i]為新的最大值}else//即a[i]不是新的最大值,但若a[i]大于次最大值if(a[i]>Sec)Sec=a[i];//a[i]為新的次最大值}System.out.print(“\n其中的最大值是:”+Max);System.out.println(“次最大值是:”+Sec);}}【例5.2】續(xù)該程序運(yùn)行結(jié)果為:數(shù)組的各元素為:85020781557693其中的最大值是:93次最大值是:81【例5.2】續(xù)【例5.3】設(shè)有n個(gè)人圍坐一圈并按順時(shí)針方向從1到n編號,從第s個(gè)人開始進(jìn)行1到m報(bào)數(shù),報(bào)數(shù)到第m的人,此人出圈,再從他的下一個(gè)人重新開始從1到m報(bào)數(shù),如此進(jìn)行下去直到所有人都出圈為止。給出這n個(gè)人的出圈順序。//app5_3.java約瑟夫環(huán)問題publicclassapp5_3{publicstaticvoidmain(Stringargs[]){finalintN=13;//總?cè)藬?shù)NfinalintS=3;//從第S個(gè)人開始報(bào)數(shù)finalintM=5;//報(bào)數(shù)到M的人出圈intp[]=newint[N];inti,s,w,j;s=S;for(i=1;i<=N;i++)p[i-1]=i;//對每個(gè)人進(jìn)行編號for(i=N;i>=2;i--)//總?cè)藬?shù)為N,依次減1{s=(s+M-1)%i;//計(jì)算下一個(gè)開始報(bào)數(shù)的人的位置if(s==0)s=i;//最后一個(gè)出圈人的位置存入變量s中w=p[s-1];//將出圈人的編號保存到變量w中for(j=s;j<=i-1;j++)p[j-1]=p[j];//從s位置開始,數(shù)組的內(nèi)容依次前移p[j-1]=w;//將w存入到空的位置中}System.out.println("\n出圈順序?yàn)椋?);for(i=p.length-1;i>=0;i--)System.out.print(""+p[i]);} }//app5_3_2.java約瑟夫環(huán)問題的另一解法publicclassapp5_3{publicstaticvoidmain(Stringargs[]){finalintN=13;//總?cè)藬?shù)NfinalintS=3;//從第S個(gè)人開始報(bào)數(shù)finalintM=5;//報(bào)數(shù)到M的人出圈intp[]=newint[N+1];intflag[]=newint[N+1];inti,j,n;for(i=1;i<=N;i++){p[i]=i;flag[i]=1;}i=S;j=1;n=0;System.out.println("\n出圈順序?yàn)椋?);while(true){while(j<M){i=(i+1>N?1:i+1);j+=flag[i];}System.out.print(""+p[i]);flag[i]=0;n++;if(n==N)break;j=0;}} }5.3foreach語句與數(shù)組

foreach語句只需提供三個(gè)數(shù)據(jù):元素類型、循環(huán)變量的名字(用于存儲連續(xù)的元素)和用于從中檢索元素的數(shù)組。foreach的語句語法如下:

for(typeelement:array){System.out.println(element);……}其功能是每次從數(shù)組array中取出一個(gè)元素,自動(dòng)賦給element,用戶不用判斷是否超出了數(shù)組的長度。需要注意的是element的類型必須與數(shù)組array中元素的類型相同。例如:int[]arr={1,2,3,4,5};for(intelement:arr)System.out.println(element);5.4多維數(shù)組雖然一維數(shù)組可以處理一般簡單的數(shù)據(jù),但是在實(shí)際的應(yīng)用中仍顯不足,所以Java提供了多維數(shù)組。但在Java中并沒有真正的多維數(shù)組,所謂多維數(shù)組只是數(shù)組的數(shù)組。5.3.1二維數(shù)組二維數(shù)組的聲明方式與一維數(shù)組類似,內(nèi)存的分配也一樣是用new運(yùn)算符。其聲明與分配內(nèi)存的格式如下所示:數(shù)據(jù)類型[][]數(shù)組名;數(shù)組名=new數(shù)據(jù)類型[行數(shù)][列數(shù)];同樣地,也可以用較為簡潔的方式來聲明數(shù)組,其格式如下:數(shù)據(jù)類型[][]數(shù)組名=new數(shù)據(jù)類型[行數(shù)][列數(shù)];如int[][]a=newint[3][4];Java的多維數(shù)組不一定是規(guī)則的矩陣形式,如圖5.5所示。

m行12567n列891011圖5.5Java語言的二維數(shù)組不一定是矩形如:int[][]x;x=newint[3][];這兩句代碼表示數(shù)組x有三個(gè)元素,每個(gè)元素都是int[]類型的一維數(shù)組。相當(dāng)于定義了三個(gè)數(shù)組引用變量,分別是intx[0][],int[]x[1]和int[]x[2],完全可以把x[0]當(dāng)作一個(gè)普通的變量名。另外intx[0][],int[]x[1]這兩個(gè)數(shù)組引用變量只是書寫方式不同而已,其作用是一樣的,目的就是幫助讀者把x[1]當(dāng)成一個(gè)普通變量名來理解。由于x[0]、x[1]和x[2]都是數(shù)組引用變量,必須對它們賦值,指向真正的數(shù)組對象,才可以引用這些數(shù)組中的元素。x[0]=newint[3];x[1]=newint[2];由此可以看出,x[0]和x[1]的長度可以是不一樣的,數(shù)組對象中也可以只有一個(gè)元素。程序運(yùn)行到這之后的內(nèi)存分配情況如圖5.6所示。x[0][]圖5.6Java中的二維數(shù)組可以看成是多個(gè)一維數(shù)組x[0][0]x[0][1]x[0][2]x[1][]x[1][0]x[1][1]nullx[2][]intx[][]二維數(shù)組的長度X.lengthX[0].lengthX[1].lengthX[2].length二維數(shù)組必須指定高層維數(shù)正確方式:Int[][]MyArray=newint[10][];Int[][]MyArray=newint[10][3];錯(cuò)誤方式:Int[][]MyArray=newint[][5];Int[][]MyArray=newint[][];

如果想直接在聲明二維數(shù)組時(shí)就給數(shù)組賦初值,可以利用花括號實(shí)現(xiàn),只要在數(shù)組的聲明格式后面再加上初值的賦值即可。其格式如下:數(shù)據(jù)類型[][]數(shù)組名={{第1行初值}, {第2行初值}, {……}, {第n+1行初值}};int[][]a={{1,2,3},{4,5,6}};int[2][3]a={{1,2,3},{4,5,6}};//錯(cuò)誤!【例5.4】計(jì)算并輸出楊輝三角形。//app5_4.java維數(shù)組應(yīng)用的例子:顯示楊輝三角形publicclassapp5_4{publicstaticvoidmain(Stringargs[]){inti,j;intLevel=7;intiaYong[][]=newint[Level][];System.out.println(“楊輝三角形”);for(i=0;i<iaYong.length;i++)iaYong[i]=newint[i+1];iaYong[0][0]=1;

for(i=1;i<iaYong.length;i++)//計(jì)算楊輝三角形{iaYong[i][0]=1;for(j=1;j<iaYong[i].length-1;j++)iaYong[i][j]=iaYong[i-1][j-1]+iaYong[i-1][j];iaYong[i][iaYong[i].length-1]=1;}for(i=0;i<iaYong.length;i++)//顯示出楊輝三角形{for(j=0;j<iaYong[i].length;j++)System.out.print(iaYong[i][j]+””);System.out.println();}}}

【例5.4】續(xù)該程序的運(yùn)行結(jié)果為:楊輝三角形111121133114641151010511615201561【例5.4】續(xù)5.3.2三維以上的多維數(shù)組要想提高數(shù)組的維數(shù),只要在聲明數(shù)組的時(shí)候?qū)⑾聵?biāo)與中括號再加一組即可。所以三維數(shù)組的聲明為int[][][]a;而四維數(shù)組為int[][][][]a;依次類推【例5.5】聲明三維數(shù)組并賦初值,然后輸出該數(shù)組的各元素,并計(jì)算各元素之和。//app5_5.java三維數(shù)組應(yīng)用publicclassapp5_5{publicstaticvoidmain(Stringargs[]){inti,j,k,sum=0;inta[][][]={{{1,2},{3,4}},{{5,6},{7,8}}};//聲明三維數(shù)組并賦初值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.println(“a[”+i+”][”+j+”][”+k+”]=”+a[i][j][k]);sum+=a[i][j][k];//計(jì)算各元素之和}System.out.println(“sum=”+sum);}}5.4字符串字符串也是編程中經(jīng)常要使用的數(shù)據(jù)結(jié)構(gòu),它是字符的序列,從某種程度上說有些類似于字符數(shù)組。

5.4.1字符串變量的創(chuàng)建聲明字符串變量的格式與其他變量一樣,分為對象的聲明與對象創(chuàng)建兩步,這兩步可以分成兩個(gè)獨(dú)立的語句,也可以在一個(gè)語句中完成。格式一:String<變量名>;<變量名>=newString(”字符串”);如:Strings;s=newString(”Hello”);上述的兩個(gè)語句也可以合并成一個(gè)語句。其格式如下:格式二:String<變量名>=newString(”字符串”);如:Strings=newString(”Hello”);格式三:String<變量名>=”字符串”;如:Strings=”Hello”5.4.2String類的常用方法Java為String類定義了許多方法??梢酝ㄟ^下述格式調(diào)用Java定義的方法:<字符串變量名>.<方法名>;分析如下語句:str=”Hello”+”java”;Inti=10;Strings=“i=”+i;Stringstr1=“Java”;Str1=str1+”Dood”;表5.1列出了String類的常用方法。

表5.1String類的常用方法方法說明publicintlength()返回字符串的長度。publicbooleanequals(Object

anObject)將給定字符串與當(dāng)前字符串相比較,若兩字符串相等,則返回true,否則返回false。publicStringsubstring(int

beginIndex)返回字符串中從beginIndex開始的子串。publicStringsubstring(int

beginIndex,int

endIndex)返回從beginIndex開始到endIndex的子串。publiccharcharAt(int

index)返回index指定位置的字符。publicintindexOf(String

str)返回str在字符串中第一次出現(xiàn)的位置。publicStringreplace(char

oldChar,char

newChar)以newChar字符替換串中所有oldChar字符。publicStringtrim()去掉字符串的首尾空格?!纠?.6】判斷回文字符串?;匚氖且环N“從前往后讀”和“從后往前讀”都相同的字符串,例如:“rotor”就是一個(gè)回文字符串。在本例中使用了兩種算法來判斷回文字符串。程序中比較兩個(gè)字符時(shí),使用關(guān)系運(yùn)算符“==”,而比較兩個(gè)字符串時(shí),則需使用equals()方法。程序代碼如下://app5_6.java字符串應(yīng)用:判斷回文字符串publicclassapp5_6{publicstaticvoidmain(Stringargs[]){Stringstr=”rotor”;inti=0,n;booleanyn=true;if(args.length>0) str=args[0];System.out.println(“str=”+str);n=str.length();charschar,echar;while(yn&&(i<n/2))//算法1{schar=str.charAt(i);//返回字符串str正數(shù)第i個(gè)位置的字符echar=str.charAt(n-i-1);//返回字符串str倒數(shù)第i個(gè)位置的字符System.out.println(“schar=”+schar+”echar=”+echar);【例5.6】續(xù)if(schar==echar) i++;else yn=false;}System.out.println(“算法1:”+yn);Stringtemp=””,sub1=””;for(i=0;i<n;i++){ sub1=str.substring(i,i+1);//將str的第i個(gè)字符載取下來賦給sub1 temp=sub1+temp;//將載下來的字符放在字符串temp的首位置}System.out.println(“temp=”+temp);System.out.println(“算法2:”+str.equals(temp));}}【例5.6】續(xù)程序可以是帶命令行參數(shù)。若在命令行方式下輸入“javaapp5_6hello”,則程序的運(yùn)行結(jié)果如下:schar=hechar=o算法1:falsetemp=olleh算法2:false【例5.6】續(xù)Java中equals和==的區(qū)別值類型是存儲在內(nèi)存中的堆棧(以后簡稱棧),而引用類型的變量在棧中僅僅是存儲引用類型變量的地址,而其本身則存儲在

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論