3.5 數組

3.5 數組
在用程序設計解決實際問題的過程中,往往要處理大量相同類型的數據,而且這些數據要被反覆引用,這時候,使用數組這一工具便是一種明智的選擇,數組可以使數據有效地排列並且讓使用者方便地訪問。
通俗一點地說:使用數組的最大好處是:可以讓一批相同性質的數據共用一個變量名,而不必爲每個數據取一個名字,不僅程序書寫大爲簡便清晰,可讀性大大提高,而且便於用重複語句簡單處理這類數據,例如,可以用數組變量sin x來記錄0~2π之間每隔平均2/π長度的正弦值,用score來表示一個學生所學過的30門課程中每門課程的分數,用height來表示100個小學生中每一個學生的身體高度等等。可以想象,如果使用前面所學的採用一般變量來處理100個小學生的身高問題,比如計算其平均身高、統計身材高於(或低於)平均身高的人數等等,每計算一個問題,都要將100個變量逐個使用(書寫)一次,工作量是相當驚人的。
對於處理小學生身高問題,當然不能簡單地用height來同時表示100個不等的數,我們還必須把100個數按一定規則組織起來,最簡便的方法,是把它們按照某種選定的序號(如1,2,……,100)排列起來,這就是構造數組的最基本手段。這樣我們就可以通過變量名字與每一個學生身高值的序號來訪問這100個數中的每一個數了。通常我們稱這裏的序號爲下標,並把它們寫在方括號中,放在變量名之後。如height[1]表示第一個學生的身高值,height[2]表示第二個學生的身高值,……,height[100]表示第一百個學生的身高值,這樣便構成了一個數組,其數組名爲height;height[1],height[2],……,height[100]稱爲該數組的元素。數組依存放元素的複雜程度,分爲一維數組、二維數組以及多維(三維以上)數組。首先介紹一維數組。

3.5.1 一維數組的聲明與引用
Java中的數組必須先聲明,然後才能使用,一維數組聲明語法格式如下:   
type<數組名>[]=new type[<元素個數>]
當按上述的語法聲明格式聲明數組後,系統會分配一塊連續的內存空間,供該數組使用。例如:
int myarray[]=new int [10];
表示聲明瞭一個一維整型數組myarray,系統爲此配置一塊內存空間供該數組使用,其元素個數爲10。要使用數組裏的元素,可以通過利用其下標來達到目的,只有一個下標值的數組就稱爲一維數組。Java數組的下標編號從0開始,以上述myarray數組爲例,myarray [0]代表該數組第1個元素,myarray[1]代表該數組第2個元素,以此類推,myarray[9]代表該數組第10個元素。因此要注意的是:如果聲明的數組元素個數爲n,則數組元素下標的變化只能是0~n-1。對於myarray數組來說,如果在程序中出現了對myarray[10]的訪問,則會引起下標越界的錯誤。
例3.5.1 數組的聲明與輸出:
程序如下:

我們經常使用循環的方式來實現數組的輸出。在使用數組過程中,經常要用到數組的元
素個數這一數值,數組的元素個數又被稱爲該數組的長度。
在程序中可以使用   數組名.length的語句表達方式來獲得數組的長度值。

3.5.2 數組的賦值
對數組的賦值有如下方法:
1.在聲明時直接賦值,語法格式爲:
type<數組名>[]={<數值1>,<數值2>,  ,<數值n>};
在大括號內的數值依次賦值給數組中的第1~n個元素。另外,在賦值聲明的時候,不需要給出數組的長度,編譯器會視所給的數值個數來決定數組的長度,例如:   int mm[]={2,4,6,8,10,12,14,16,18,20}
在上面的語句中,聲明瞭一個數組mm,雖然沒有特別指名mm的長度,但由於括號裏的數值有10個,編譯器會分別依序指定給各元素存放,使mm[0]=2,mm[1]=4,……mm [9]=20。
2.若是對數組的元素進行有規律的賦值,則可以使用循環的方式進行。例3.5.2 數組的賦值示例。
程序如下:
 

3.5.3 一維數組程序舉例
例3.5.3 字符型數組的賦值與輸出。
程序如下:

例3.5.4 求出一維數組中的最大值和最小值。
程序如下:


例3.5.5 利用一維數組輸出8行楊輝三角形(圖3-11)。楊輝三角形:三角形中各行中的數字正好是二項式a+b乘方後,展開式中各項的係數。比如:a+b≠0時
(a+b) 0 =1
(a+b) 1 =a+b
(a+b) 2 =a 2 +2ab+b 2
(a+b) 3 =a 3 +3a 2 b+3ab 2 +b 3 …………
圖3ˉ11 楊輝三角形 

仔細觀察此三角形,你還可以發現它這樣的排列規律:每下一行的數比上一行多一個,兩邊都是1,中間各數都寫在上一行兩數的中間,且等於它們的和。爲簡單起見,本程序忽略輸出格式,將每一行的數組元素均放在第一列輸出。程序如下:


例3.5.6 用選擇法對十個數按從小到大進行排序,然後輸出。
選擇法的思想方法是:首先在給定的數組中找到一個最小的數,將其換到數組的第一個元素的位置。然後再在第二個數到最後一個數之間求得最小數,將其換到數組的第二個元素的位置。以此類推,直到最後,得到的結果便是已完成的遞增序列。
選擇法排序程序如下:  

3.5.4 二維數組的聲明及引用
在Java中,因爲數組元素可以聲明成任何類型,因此如果一維數組的元素的數據類型還是一維數組的話,這種數組就被稱爲二維數組。二維數組聲明語法格式如下:  
type<數組名>[][]=new type[<行元素個數>][<列元素個數>]; 
例如:
int My2array[][]=new int[5][6];
上述語句聲明瞭一個二維數組,其中[5]表示該數組有(0~4)5行,每一行有(0~5)6個元素,因此整個數組有30個元素。
對於二維數組元素的賦值,同樣可以在聲明的時候進行。
例如:  
int ssa[][]={{20,25,26,22},{23,24,20,28}};
聲明瞭一個整型的2行4列的數組,同時進行賦值,結果如下:  
ssa[0][0]=20;
ssa[0][1]=25;
ssa[0][2]=26;
ssa[0][3]=22;
ssa[1][0]=23;
ssa[1][1]=24;
ssa[1][2]=20;
ssa[1][3]=28; 
例3.5.7 二維數組的建立與輸出。
程序如下:

Java的多維數組的聲明使用相當靈活,它可以從最高維起分別爲每一維分配內存,對於創建二維數組來說,可以使用如下的更靈活的聲明方式:  

該程序段說明創建的數組第一維長度是arrNum1,第二維長度是arrNum2,如果第二維的大小處處一致,我們可以理解爲目前創建的是一個矩陣數組。另外,在Java中還可以創建非矩陣數組。
例如:


arrN數組爲5行,每行的元素個數分別爲:1、3、5、5、5,甚至可以各不相同。
它產生的二維數組的形式是: 

這也就意味着在Java中可以隨時動態地建立數組。
例3.5.8 使用動態建立二維數組的方式輸出8行楊輝三角形。
程序如下:


該程序運行結果與例3.5.5相同。

3.5.5 數組的複製
Java在System類中提供了一個特殊的方法arraycopy(),用於實現數組之間的複製,我們通過具體實例來說明該方法的使用。
例3.5.9 數組的複製:使用arraycopy()方法。
程序如下:

3.5.6 字符串處理
SDK1.4.2是採用Unicode V3.0來處理字符的,字符串是內存中一個或多個連續排列的字符集合。Java提供的標準包java.lang中封裝的String類就是關於字符串處理的類。這個類封裝了很多方法,用來支持字符串的操作。
1.字符串聲明及初始化
與其他基本數據類型相似,Java中的字符串分常量和變量兩種。當程序中出現了字符串常量,系統將自動爲其創建一個String對象,這個創建過程是隱含的。對於字符串變量,在使用之前同樣要進行聲明,並進行初始化,字符串聲明語法格式如下:   String<字符串變量名>;
字符串一般在聲明時可以直接進行初始化,初始化過程一般爲下面幾種:
創建空的字符串:
String s1=newString(); 
由字符數組創建字符串:
char ch[]={′s′,′t′,′o′,′r′,′y′};String s2=newString(ch);
直接用字符串常量來初始化字符串:  
String s3=″Hel lo!Welcome to Java!″;
 2.字符串運算符“+”
在Java中,運算符“+”除了作爲算術運算符使用之外,它還經常被作爲字符串運算符用於連接不同的字符串。即它的運算規則是:“abc”+“def”=“abcdef”。但如果在你的運算表達式中還有其他類型的數據,我們就有必要注意一下“+”的工作方式了。首先請看下面的例題。
例3.5.10 “+”的運算方式:  


從上面的程序運行結果可以看到:如果“+”的兩端都是字符串的話,則“+”的功能是將這兩個字符串連接起來;如果在“+”兩端有一個是字符串,Java就會將非字符串的數據轉換爲字符串,然後進行字符串連接運算;而當“+”的兩端是數值類型數據時,Java則將“+”號作爲算術運算符進行加運算。希望大家在以後進行的程序設計過程中注意這些區別。
3.String類
String類中常用的方法有:
1)int length():返回當前字符串中的字符個數。
2)boolean equals(String str):區分大小寫比較兩個字符串的內容是否相等。
3)boolean equalsIgnoreCase(String str):不區分大小寫比較兩個字符串的內容是否相等。
4)char charAt(int index):返回字符串中index處位置的字符。
5)String toLowerCase():將當前字符串中所有字符轉換爲小寫形式。
6)String toUpperCase():將當前字符串中所有字符轉換爲大寫形式。
7)String substring(int BIndex):截取當前字符串中從BIndex開始到末尾的子串。
8)boolean startsWith(String str):測試當前字符串是否以str字符串爲開頭。
9)char replace(char c1,char c2):將當前字符串中的c1字符轉換爲c2字符。
10)String trim():返回去掉了當前字符串前後空格的字符串。
11)int indexOf(String str,int i):在當前的字符串中從i處查找str子串,若找到,返回子串第一次出現的位置,否則返回-1。
使用String類方法的基本形式:
<字符串變量名>.<方法名>(<參數>);
式中的<字符串變量名>就是當前要處理的字符串。
例3.5.11 字符串比較方法的使用。
程序如下:


本例題要提請大家注意的問題是:String並非Java的基本數據類型,而是java.lang中的(字符串)類,s1和s2是String類中的兩個對象(關於類和對象的基本概念將在第4章中向大家作詳細介紹),因此要比較s1和s2中的內容是否相同,要使用equals()或者equalsIgnoreˉCase()方法,而不是用“==”去進行判別。例3.5.12 String類常用方法的使用。
程序如下:
 
例3.5.13 使用字符串處理方法對文本語句中的單詞記數。
程序如下:


看了上面的例題,各位有什麼問題嗎?一定有的。首先“Character”是什麼?如果說是對象或是變量,則它並沒有被聲明過,顯然它也不會是Java的運算符,其實,Character與String一樣也是java.lang中的類,但它是字符類。在本例題中的toLowerCase()方法是封裝於Character類中的,它的作用是返回括號內字符的小寫字母的Unicode代碼值(Unicode前128位代碼值與ASCII代碼值相同)。
接下來的問題是:爲什麼Character類中的方法可以通過類名直接調用,而String類中的方法則必須通過聲明字符串變量以後由字符串變量名來調用呢?那是因爲:Character類中封裝的toLowerCase()方法,是靜態(static)的。Java規定:凡靜態的方法被調用時無須創建它所在類的對象,而可以以該類的類名直接調用。而String類中封裝的toLowerCase()方法則是非靜態的,因而必須通過創建對象以後由對象名來調用。以上所講的這些內容可以參照
第4章的相關章節。
4.StringBuffer類
Java的String類提供了字符串查找及測試的一些方法,但如果要對字符串做連接或修改等操作,則必須使StringBuffer類來聲明字符串,並用這個類所提供的方法來進行操作。StringBuffer類與String類一樣,都被置於java.lang類庫中。StringBuffer類的常用方法有:
1)StringBuffer append(char c):將字符c放到字符串緩衝區之後。
2)StringBuffer append(String str):將字符串str放到字符串緩衝區之後。
3)StringBuffer deleteCharAt(int index):刪除字符串緩衝區中第index位置的字符。
4)StringBuffer insert(int k,char c):在字符串緩衝區的第k個位置插入字符c。
5)StringBuffer insert(int k,String str):在字符串緩衝區的第k個位置插入字符串str。
6)StringBuffer replace(int m,int n,String str):將字符串緩衝區中第m到n之間以字符串str取代。
7)StringBuffer reverse():將字符串緩衝區中的字符串按反向排列。
例3.5.14 StringBuffer類常用方法的使用。


在String類與StringBuffer類中還封裝了許多其他的方法,同樣希望大家學習與使用時,經常參閱API文檔。



發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章