第七章 一維數組
7.2 數組的基礎知識
1.一旦數組被創建,它的大小是固定的。使用一個數組引用變量,通過下標來訪問數組中的元素。
2.數組是用來存儲數據的集合,但是,通常我們會發現把數組看作一個存儲具有相同類型的變量集合會更有用。
7.2.1 聲明數組變量
1.為了在程序中使用數組,必須聲明一個引用數組的變量,並指明數組的元素類型
語法:elementType[] arrayRefVar;(數據類型[] 數組引用變量)
2.elementType可以是任意數據類型,但是數組中所有的元素都必須具有相同的數據類型。
7.2.2 創建數組
1.不同於基本數據類型變量的聲明,聲明一個數組變量時並不在內存中給數組分配任何空間。它只是創建一個對數組的引用的存儲位置。如果變量不包含對數組的引用,那么這個變量的值為null。除非數組已經被創建,否則不能給它分配任何元素。
例子:double[] myList=new double[10];
2.一個數組變量看起來似乎是存儲了一個數組,但實際上它存儲的是指向數組的引用。嚴格來講,一個數組變量和一個數組是不同的,但多數情況下它們的差別是可以忽略的。
7.2.3 數組大小和默認值
當數組分配空間時,必須指定該數組能夠存儲的元素個數,從而確定數組大小。創建數組之后就不能在修改它的大小。
7.2.4 訪問數組元素
1.數組元素可以通過下標訪問。數組下標是基於0的,也就是說,其范圍從0開始到arrayRefVar.length-1結束。
2.數組中的每個元素都可以使用下面的語法表示,稱為下標變量(indexed variable)
7.2.5 數組初始化語法
1.Java有一個簡捷的標記,稱作數組初始化語法,它使用下面的語法將聲明數組、創建數組和初始化數組結合到一個語句中:
elementType[] arrayRefVar={value0,value1,value2,...,valuek};
(元素類型[] 數組引用變量={值1,值2,...,值k};)
2.數組初始化語法中不使用操作符new。使用數組初始化語法時,必須聲明、創建和初始化數組都放在一條語句中。將他們分開會產生語法錯誤。因此,下面的語句是錯誤的:
double[] myList;
myList={1.9,2.9,3.4,3.5};
7.2.6 處理數組
處理數組元素時,經常會用到for循環,理由有以下兩點:
- 數組中所有元素都是同一類型的。可以使用循環以同樣的方式反復處理這些元素。
- 由於數組的大小是已知的,所以很自然地就使用for循環。
7.3 編寫一個程序,找到大於所有平均值的那些項
1 package com.chapter7; 2 3 import java.util.Scanner; 4 5 public class AnalyzeNumber { 6 7 /** 8 * 找到大於所有項大於平均值的那些項 9 */ 10 11 public static void main(String[] args) { 12 13 Scanner input=new Scanner(System.in); 14 15 System.out.println("請輸入要存儲的個數"); 16 int n=input.nextInt(); 17 18 double[] numbers=new double[n]; 19 double sum=0; 20 21 System.out.println("請輸入您想存儲的數字"); 22 for(int i=0;i<numbers.length;i++){ 23 numbers[i]=input.nextDouble(); 24 sum+=numbers[i]; 25 } 26 27 double avg=sum/n; 28 System.out.println("平均值為:"+avg); 29 30 for (int i = 0; i < n; i++) { 31 if(numbers[i]>avg){ 32 System.out.println(numbers[i]); 33 } 34 } 35 36 } 37 38 }
7.5 數組的復制
1.在Java中,可以使用復制語句復制基本數據類型的變量,但不能復制數組。將一個數組變量賦值給另一個數組變量,實際上是將一個數組的引用復制給另一個變量,使兩個變量都指向相同的內存地址。
2.復制數組的三種方法:
- 使用循環語句逐個地復制數組的元素。
- 使用System類中的靜態方法arraycopy。
- 使用clone方法復制數組。
-
-
-
1 int[] sourceArray={2,3,1,5,10}; 2 int[] targetArray=new int[sourceArray.length]; 3 for(int i=0;i<sourceArray.length;i++){ 4 targetArray[i]=sourceArray[i]; 5 } 6 7 System.arraycopy(sourceArray, 0, targetArray, 0, sourceArray.length); 8 9 for (int i : targetArray) { 10 System.out.println(i); 11 }
-
-
-
7.6 將數組傳遞給方法
Java使用按值傳遞(pass-by-value)的方式將實參傳遞給方法。傳遞基本數據類型變量的值與傳遞數組值有很大的不同。
- 對於基本數據類型參數,傳遞的是實參的值。
- 對於數組類型參數,參數值是數組的引用,給方法傳遞的這個引用。從語義上來講,最好的描述就是參數傳遞的是共享信息(pass-by-sharing),既方法中的數組和傳遞的數組是一樣的。所以,如果改變方法中的數組,將會看到方法外的數組也變化了。
7.7 從方法中返回數組
1 package com.chapter7; 2 3 public class Reverse { 4 5 public static void main(String[] args) { 6 7 int[] list1={1,2,3,4,5}; 8 int[] list2=reverse(list1); 9 for (int i : list2) { 10 System.out.println(i); 11 } 12 13 } 14 15 public static int[] reverse(int[] list){ 16 17 int[] result=new int[list.length]; 18 19 for(int i=0,j=list.length-1;i<list.length;i++,j--){ 20 result[j]=list[i]; 21 } 22 return result; 23 } 24 25 }
7.8 示例學習:統計每個字母出現的次數
package com.chapter7; import java.util.Random; import com.chapter6.RandomCharacter; public class CounteLettersInArray { /** * 統計一個字符數組中每個字母出現的次數 */ public static void main(String[] args) { char[] chars=createArray(); displayArray(chars); int[] counts=countLetters(chars); displayCounts(counts); } public static char[] createArray(){ char[] chars=new char[100]; for(int i=0;i<chars.length;i++){ chars[i]=RandomCharacter.getRandomCharacter('a', 'z'); } return chars; } public static void displayArray(char[] chars){ for(int i=0;i<chars.length;i++){ if((i+1)%20==0){ System.out.println(chars[i]); }else{ System.out.print(chars[i]+" "); } } } public static int[] countLetters(char[] chars){ int[] counts=new int[26]; for(int i=0;i<counts.length;i++){ counts[chars[i]-'a']++; } return counts; } public static void displayCounts(int counts[]){ for(int i=0;i<counts.length;i++){ if((i+1)%10==0){ System.out.println((char)(i+'a')+"出現"+counts[i]+"次"); }else{ System.out.print((char)(i+'a')+"出現 "+counts[i]+"次"); } } } }
7.9 可變長參數列表
1.具有同樣類型的可變長度的參數可以傳遞給方法,並將作為數組對待。
2.可以把類型相同但個數可變的參數傳遞給方法,方法中的參數聲明如下:
typeName...parameterName(類型名...參數名)
1 package com.chapter7; 2 3 public class VarArgsDemo { 4 5 public static void main(String[] args) { 6 printMax(34,3,3,2,56.5); 7 printMax(new double[]{1,2,3}); 8 } 9 10 public static void printMax(double...numbers){ 11 if(numbers.length==0){ 12 System.out.println("No argument passed");//沒有參數傳遞 13 return; 14 } 15 16 double result=numbers[0]; 17 18 for(int i=1;i<numbers.length;i++){ 19 if(numbers[i]>result){ 20 result=numbers[i]; 21 } 22 } 23 System.out.println("The max value is"+result); 24 25 } 26 27 }
7.1 數組的查找
如果一個數組排好序了,對於尋找數組中的一個元素,二分查找法比線性查找更高效。
7.10.1 線性查找法
線性查找法將要查找的關鍵字key與數組中的元素逐個進行比較。這個過程持續在列表中找到與關鍵字匹配的元素,或者查完列表也沒有找到關鍵字為止。如果匹配成功,線性查找法返回與關鍵字匹配的元素在數組中的下標。如果沒有匹配成功,則返回-1。
1 package com.chapter7; 2 3 public class LinearSearch { 4 5 public static void main(String[] args) { 6 7 int[] list={1,4,4,2,5,-3,6,2}; 8 int i=linearSearch(list, 4); 9 System.out.println(i); 10 int j=linearSearch(list, -4); 11 System.out.println(j); 12 } 13 14 public static int linearSearch(int[] list,int key){ 15 for(int i=0;i<list.length;i++){ 16 if(key==list[i]){ 17 return i; 18 } 19 } 20 return -1; 21 } 22 }
7.10.2 二分查找法
二分查找法是另一種常見的對數值列表的查找方法。使用二分查找法的前提條件是數組中的元素必須已經排好序。假設數組已按升序排列。二分查找法首先將關鍵字與數組的中間元素進行比較。考慮下面三種情況:
- 如果關鍵字小於中間元素,只需要在數組的前一半元素中繼續查找關鍵字。
- 如果關鍵字和中間元素相等,則匹配成功,查找結束。
- 如果關鍵字大於中間元素,只需要在數組的后一半元素中繼續查找關鍵字。
7.11 數組的排序
選擇排序
package com.chapter7; public class SelectionSort { public static void main(String[] args) { int[] list={9,8,7,6,5,4,3,2,1}; SelectionSort.selectionSort(list); } public static void selectionSort(int[] list){ for(int i=0;i<list.length-1;i++){ for(int j=i+1;j<list.length;j++){ int temp=list[i]; list[i]=list[j]; list[j]=temp; } } for (int i : list) { System.out.println(i); } } }
7.12 Arrays類(java.util.Arrays)
1.Arrays類包含一些實用的方法用於常見的數組操作,,比如排序和查找。
2.Arrays類包含各種各樣的靜態方法,用於實現數組的排序和查找、數組的比較和填充數組元素,以及返回數組的字符串表示。這些方法都有對所有基本類型的重載方法。
3.可以使用sort或parallelsort方法對整個數組或部分數組進行排序。
4.可以采用二分查找法(binarySearch方法)在數組中查找關鍵字。數組必須提前按升序排列好。如果數組中不存在關鍵字,方法返回 -(插入點下標+1)。
5.可以采用equals方法檢測兩個數組是否相等。如果他們的內容相同,那么這兩個數組相等。
6.可以使用fill方法填充整個數組或部分數組。
7.可以是同toString方法來返回一個字符串,該字符串中代表了數組中的所有元素。這是一個顯示數組中所有元素的快捷和簡便的方法。