23. 數組
1、數組定義
(1)什麽是數組?
數組簡單來說就是連續的多個變量的集中定義。
(2)為什麽要定義數組?
數組用來解決多個變量定義的問,如幾千幾萬變量無法一個一個去定義,這時就需要定義數組。
如下:給出多個數值,求最大值問題
1 //給出多個數值求最大值 2 int[] array = { 5, 45, 8, 7, 42 }; 3 int maxNum = 0; 4 for (int i = 0; i < array.Length ; i++) 5 { 6 if(array [i ]>maxNum ) 7 { 8 maxNum = array[i]; 9 } 10 } 11 Console.WriteLine(maxNum ); 12 Console.ReadKey();
數組存儲方式:在內存中,數組存儲在連續的區域內部,因為數組中每個元素的類型相同,所有占用的內存大小也一致。所以在訪問數組中的元素時可以直接根據數組在內存中的起始位置及下標來計算元素的位置。數組的下標也稱為索引,是從0開始的,最大索引是數組的元素總數據減1。數組元素可以為任何數據類型,在初始化數組時必須指定數組長度。
2、、一維數組的聲明:
以線性方式存儲固定數目的數組元素,他只需一個索引值即可標識任意一個數組元素。
聲明格式:數據類型 [] 數組名稱;
初始化:
(1)數組的大小一定是一個常量;
(2)數組元素值已知時, 用字面值聲明;元素值未知時,用new關鍵字;
(3)數組大小與總數個數一致,否則編譯失敗;
(4)組在初始化時必須指定一個長度給他,聲明的時候則不需要。
1 //已知變量值的數組聲明及初始化 2 int[] myintArray = { 0, 2, 4, 6, 8 }; 3 4 //未知數組各元素的值的聲明及初始化 5 string[] mystringArray;//聲明 6 mystringArray = new string[100]; //初始化 7 //或者 8 string[] mystringArray1 = new string[100]; 9 10 //元素個數與數組長度必須一一對應 11 const int a = 3; //利用const將a定義為常量 12 string[] nameArray = new string[a] { "張三","李四", "王八" };
3、一維數組的使用:
一維數組遍歷時應該盡量使用foreach語句,因為他會自動檢查數組的索引,使其不會出現越界值。
//例: int[] myintArray = { 0, 2, 4, 6, 8, 10 }; //輸出數組中的元素 Console.WriteLine(myintArray[3]); //這裏的3指索引值 //給數組元素重新賦值 myintArray[3] = 100; Console.WriteLine(myintArray[3]); //利用for循環遍歷數組中的元素 for (int i = 0; i < 6; i++) { Console.WriteLine(myintArray[i ]); } //利用foreach遍歷 foreach(int myint in myintArray) Console.WriteLine(myint); Console.ReadKey();
4、二維數組
遍歷時幾維數組就需要幾個for循環語句嵌套,而利用foreach與則只需要一個。但是foreach語句不能控制整體元素的輸出行列。
格式:數據類型 [,] 數組名稱;
//如果[,,]是兩個逗號,則是三維數組。如:string [,,] mystrArray =new string [3,2,2];
//我們可以將[3,2,2]簡單理解為 三個二維數組,這個二維數組由2行2列構成。
//例: //已知二維數組元素的聲明及初始化 string[,] frend= { { "張三", "女" }, { "李四", "男" }, { "王八", "女" } }; //未知二維數組元素的聲明及初始化 string[,] frend1 = new string[3, 2]; //[3,2]三行二列 string [,]frent2=new string [3,2] { { "張三", "女" }, { "李四", "男" }, { "王八", "女" } }; //二維數組的輸出 Console.WriteLine(frent2[1,0]); //重新賦值 frent2[1, 0] = "小朋友"; Console.WriteLine(frent2[1,0]); //利用for 語句遍歷:以下是正序輸出 for (int i = 0; i < 3; i++)//行 { for (int j = 0; j < 2; j++)//列 { Console.Write(frent2[i,j]+" \t"); } Console.WriteLine();//輸出列以後換行 } //以下是倒序輸出 Console.WriteLine("以下是倒序輸出:"); for (int i = 2; i >= 0; i--) { for (int j = 1; j >= 0; j--) { Console.Write(frent2[i,j ]+"\t"); } Console.WriteLine(); } //利用foreach語句遍歷 foreach (string frent3 in frent2) { Console.Write(frent3+"\t"); } Console.ReadKey();
5、二維數組的屬性
//例: string [,]frent2=new string [3,2] { { "張三", "女" }, { "李四", "男" }, { "王八", "女" } }; //Length這個屬性輸出數組包含元素的總個數 Console.WriteLine(frent2.Length); //GetLowerBound這個屬性輸出指定維度的下限,如(1)則輸出列的下限為0 Console.WriteLine(frent2.GetLowerBound(1)); //GetUpperBound這個屬性輸出指定維度的上限,如果(0)則輸出行的上限為2 Console.WriteLine(frent2.GetUpperBound(0)); Console.ReadKey();
查找數組元素:註意他與字符串查找的區別,查找數組是Array.IndexOf()
//例: int[] intArray = { 1, 2, 3, 45, 46, 23, 15, 9, 8, 7, 4, 5, 55, 45, 2, 11 }; int result; //Array.IndexOf(參數1,參數2):參數1是我們要查找的數組,參數2是要查找的元素 //result = Array.IndexOf(intArray, 99);//如果元素不存在,則返回一個負數-1 result = Array.LastIndexOf(intArray, 45); Console.WriteLine(result); //BinarySearch方法采用的是二分法,該方法的查找速度比IndexOf快 int result1 = Array.BinarySearch(intArray, 10002);//用於查找首次出現的索引值,如果不存在該元素則返回一個負數-17 Console.WriteLine(result1); //Array的Contains(是否包含某個元素)方法返回的是一個布爾值,該方法是對IList接口中方法的實現 bool mybool; mybool = ((System.Collections.IList)intArray).Contains(15); Console.WriteLine(mybool); Console.ReadKey();
6、數組排序
方法:Array.sort (要排序的數組);
Array.Reverse (要排序的數組);
該方法沒有返回值,直接更改數組的排序。並且該方法只支持一維數組。
//例: int[] mystrArray = { 22, 565, 65, 6, 5, 5, 5, 656, 5, 4, 75, 4, 48, 45, 465, 8, 7, 26, 66 }; //Array.Sort(mystrArray); //Console.WriteLine("實現數組升序輸出:"); //foreach(int outint in mystrArray) // Console.Write(outint+"\t"); //Array.Reverse(mystrArray); //Console.WriteLine(); //Console.WriteLine("實現數組降序輸出:"); //foreach(int outint in mystrArray) // Console.Write(outint+"\t"); Array.Sort(mystrArray); for (int i=0;i < 19; i++) { Console.Write(mystrArray[i ] +"\t"); } Console.ReadKey();
7、數組的合並與拆分
數組的合並指的是將兩個數組合並到第三個數組中,同樣的數組的拆分需要聲明一個新的數組用來存放從其他數組中復制出了的元素;
Copy方法1:Array.Copy(源數組1,目標數組,要復制的長度);
Copy方法2:Array.Copy(源數組2,從某個索引值開始復制,目標數組,從目標數組的某個索引值位置開始存放復制的長度,從源數組2中要復制的長度);
//例: int[] num1 = { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, }; int[] num2 = { 10, 11, 12, 13, 14, 15, 16, 17, 18, 19 }; Console.WriteLine("輸出數組num1:"); foreach (int ournum in num1) Console.Write(ournum+"\t"); Console.WriteLine("輸出數組num2:"); foreach (int ournum in num2) Console.Write(ournum+"\t"); //outnum 只在foreach語句中作用域,出了foreach語句相當於沒有聲明這個變量。所以能取與前一個foreach語句相同的名字 //合並。。 //聲明一個新的數組用於接收數組1和2的元素 int[] resultNum = new int[24]; //接下來把數組1和2分別復制到resultNum中,實現數組的合並 Console.WriteLine("合並後的結果:"); //第一步 Array.Copy(num1, resultNum, 10); //在數組num1中復制10個元素放到數組resultNum中。從索引值0開始依次復制 //復制第二個數組時不能再用第一種重載方式Array.Copy(num2, resultNum, 10);,這樣會覆蓋第一次復制的元素 //第二步 //用第二種重載方式復制數組2 Array.Copy(num2, 0, resultNum, 14, 10); //在num2中從索引值0開始復制10個長度,放入到resultNum中並從索引值14開始存放 //沒有存放數組元素的長度用0輸出表示 foreach (int outnum in resultNum) Console.Write(outnum+"\t"); //拆分 //再聲明一個新的數組來實現數組的拆分 int[] resultNum1 = new int[7]; Console.WriteLine(); Console.WriteLine("拆分後的結果:"); Array.Copy(resultNum, 10, resultNum1, 0, 7); foreach (int outnum in resultNum1) Console.Write(outnum+"\t"); Console.ReadKey();
8、ArrayList類元素的添加
ArrayList(數組列表)類元素的添加:是一種更高級級的擴充的數組,被稱為動態數組或者集合。
使用步驟:
1)引入命名空間System.Collections;
2) 創建實例
3)引用對應的屬性或方法
//例: ArrayList myArrayList = new ArrayList(); //ArrayList的長度是不固定的,存儲元素的類型隨意 //而一般數組的長度是固定的,不能更改的,類型單一,只能存儲一種類型的數據 Console.WriteLine("myArrayList初始化後的元素個數為:{0}",myArrayList.Count);//count用於獲取ArrayList中包含的元素的個數 //Add方法用於向ArrayList中添加單個元素,每次只能添加一個 myArrayList.Add(124); myArrayList.Add(‘g‘); myArrayList.Add("mystring"); myArrayList.Add(25.2); Console.WriteLine("使用Add方法向ArrayList類中添加元素之後,有{0}個元素",myArrayList.Count); //AddRange方法用於向ArrayList類中添加多個元素,可以是一個數組。如下 string[] mystrArray = { "張三", "李四", "王八" }; myArrayList.AddRange(mystrArray); foreach(object outelement in myArrayList) Console.Write(outelement+"\t"); Console.ReadKey();
9、ArrayList類中元素的刪除
方法:1、變量名.Remove(要刪除的元素);
2、變量名.RemoveAt(索引值);
3、變量名.RemoveRange(開始索引值,要刪除的個數);
4、變量名.Clear();//清除所有元素
//例: ArrayList myArrayList = new ArrayList(); //給myArrayList添加元素 int[] mystrArray = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 45, 61, 11, 254, 85, 46, 45, 51 }; myArrayList.AddRange(mystrArray); foreach (int outelement in myArrayList) Console.Write(outelement+"\t"); //用Remove方法刪除 myArrayList.Remove(1);//這裏1指的是數組的元素 Console.WriteLine(); Console.WriteLine("刪除1後的數組為:"); foreach(int outelement in myArrayList) Console.Write(outelement+"\t"); //用RemoveRange方法刪除 myArrayList.RemoveRange(2, 5); Console.WriteLine(); Console.WriteLine("刪除索引值2開始的5個數後的數組為:"); foreach (int outelement in myArrayList) Console.Write(outelement + "\t"); Console.ReadKey();
10、ArrayList類的查找
註意與其他數組及字符串查找有區別。
//例: //聲明一個ArrayList類的變量,並給他添加元素 ArrayList myArrayList = new ArrayList(); int[] mystrArray = { 1, 2, 3, 4,52, 5, 6, 7, 8, 9, 12, 45, 56, 41, 52 }; myArrayList.AddRange(mystrArray); //IndexOf(要查找的元素)查找方法,返回一個首次出現的索引值,如果找不到則返回-1 Console.WriteLine(myArrayList.IndexOf(7)); //LastIndexOf(要查找的元素)方法,返回最後一個出現的索引值,否則返回-1 Console.WriteLine(myArrayList.LastIndexOf(0)); //BinarySearch();利用該方法進行查找的時候會自動轉換為二進制 Console.WriteLine(myArrayList.BinarySearch(3)); Console.ReadKey();
23. 數組