版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報或認(rèn)領(lǐng)
文檔簡介
1、第6章特殊的類—集合與泛型,? 集合? ArrayList類? HashTable類? 泛型,第6章特殊的類—集合與泛型,? 集合? ArrayList類? HashTable類? 泛型,6.1集合,在第2章中我們學(xué)習(xí)的數(shù)組是一組具有相同名稱和類型的變量集合,但是數(shù)組初始化后就不能再改變其大小,不能實現(xiàn)在程序中動態(tài)添加和刪除數(shù)組元素,使數(shù)組的使用具有很多局限性。集合能解決數(shù)組存在的這個問題,下面我們
2、來學(xué)習(xí)介紹集合的相關(guān)內(nèi)容。,6.1.1 集合概述,什么是集合呢? 集合就如同數(shù)組,用來存儲和管理一組具有相同性質(zhì)的對象,除了基本的數(shù)據(jù)處理功能,集合直接提供了各種數(shù)據(jù)結(jié)構(gòu)及算法的實現(xiàn),如隊列、鏈表、排序等,可以讓你輕易地完成復(fù)雜的數(shù)據(jù)操作。集合是一個特殊的類,好比容器一樣將一系列相似的項組合在一起,集合中包含的對象稱為集合元素。集合可分為泛型集合類和非泛型集合類。,,泛型集合類一般位于System.Collections.Generi
3、c命名空間,非泛型集合類位于System.Collections命名空間,除此之外,在System.Collection. Specialized命名空間中也包含了一些有用的集合類。,6.1.2 System.Collections命名空間,System.Collections是一個命名空間,包括一組接口和可使用的集合類,這些接口和類定義各種對象(如列表、隊列、位數(shù)組、哈希表和字典)的集合。,第6章特殊的類—集合與泛型,? 集合
4、? ArrayList類? HashTable類? 泛型,6.2.1 ArrayList類介紹,ArrayList是System.Collections命名空間中的類,類似于數(shù)組,有人稱其為動態(tài)數(shù)組,其容量可以根據(jù)需要自動擴充,元素的索引也可根據(jù)元素數(shù)量重新分配,可以動態(tài)實現(xiàn)元素的添加、刪除等操作。下表列出了ArrayList類的幾個常用屬性。,,,6.2.2 ArrayList類的使用,1. 創(chuàng)建ArrayList
5、為了創(chuàng)建ArrayList,可以使用三種重載構(gòu)造函數(shù)中的一種,還可以使用ArrayList的靜態(tài)方法Repeat創(chuàng)建一個新的ArrayList。這三個構(gòu)造函數(shù)的聲明如下。使用默認(rèn)的初始容量創(chuàng)建ArrayList,該實例并沒有任何元素。格式如下:public ArrayList();,,使用實現(xiàn)了ICollection接口的集合類來初始化新創(chuàng)建的ArrayList。格式如下:public ArrayList(ICollection
6、 c);指定一個整數(shù)值來初始化ArrayList的容量,創(chuàng)建ArrayList。格式如下:,ArrayList的四種創(chuàng)建方法舉例如下:01 //1.使用默認(rèn)的初始容量創(chuàng)建ArrayList,該實例并沒有任何元素02 ArrayList al1 = new ArrayList(); //創(chuàng)建一個ArrayList對象al103 al1.Add(“Hello”); //向al1的末尾添加一個集合元素04 al1
7、.Add(“C#”); //向al1的末尾添加一個集合元素05 al1.Add(“World!”); //向al1的末尾添加一個集合元素06 //輸出al1中的容量和元素個數(shù)07 Console.WriteLine(“該ArrayList的容量是:{0},元素個數(shù)是,{1}”, al1.Capacity, al1.Count); 08 //2.使用實現(xiàn)了ICollection接口的集合類來初始化新創(chuàng)建的Arr
8、ayList,09 // 該實例與參數(shù)中的集合具有相同的初始容量10 ArrayList al2 = new ArrayList(al1);//創(chuàng)建ArrayList對象al2,并用al1初始化al2 11 121 //3.經(jīng)由指定一個整數(shù)值來初始化ArrayList的容量123 ArrayList al3 = new ArrayList(18);//ArrayList對象al3,容量初始為指定的數(shù)值1
9、813 4 Console.WriteLine(“該ArrayList的容量是:{0},元素個數(shù)是,{1}”, al1.Capacity, al1.Count);14 5 //4.將指定abc字符串重復(fù)3次構(gòu)造數(shù)組15 6 ArrayList al4 = ArrayList.Repeat(“abc”, 3);//指定abc字符串重復(fù)3次構(gòu)造ArrayList對象al4,,2. 向ArrayList中添加元素的方法,創(chuàng)建好
10、ArrayList后,有兩種方法可向ArrayList末尾中添加元素。(1)Add方法將單個元素添加到列表的尾部;AddRange方法獲取一個實現(xiàn)ICollection接口的集合實例,例如Array、Queue、Stack等,并將這個集合實例按順序添加到列表的尾部。,(2)也可使用Insert和InsertRange方法向ArrayList中指定的位置插入元素:Insert方法添加單個元素到指定的索引位置;InsertRange從指定
11、的位置開始添加一個實現(xiàn)了ICollection接口的實例。例如:01 ArrayList al = new ArrayList(20); //聲明一個接受20個元素的ArrayList02 al.Add(“我是元素1”); //使用ArrayList的Add方法添加集合元素03 al.Add(“我是元素2”);//使用ArrayList的Add方法添加集合元素04 al.Add(“我是元素3”);/
12、/使用ArrayList的Add方法添加集合元素05 string[] strs = {”我是元素4”, “我是元素5”, “我是元素6” };//定義一個有三個元素的字符串?dāng)?shù)組06 al.AddRange(strs); //使用AddRange方法按集合參數(shù)中元素的順序添加07 al.Insert(0,”新增第1個元素”);//在ArrayList的指定索引0處添加一個新元素08 ArrayList
13、 list2=newArrayList(); //創(chuàng)建一個ArrayList對象list209 list2.Add(“我是新增元素1”); //使用ArrayList的Add方法添加集合元素10 list2.Add(“我是新增元素2”);//使用ArrayList的Add方法添加集合元素11 al.InsertRange(2,list2);//將list2中的兩個元素插入到al中的索引為2的位置。,3. 刪
14、除ArrayList中的元素,ArrayList提供了三種方法將指定元素從集合中移除,這三種方法是Remove、RemoveAt和RemoveRange方法。Remove方法接受一個object類型的參數(shù),用于移除指定元素值的第一個匹配集合元素。RemoveAt方法接受一個int類型的參數(shù),用于刪除指定索引的集合元素。RemoveRange方法從集合中移除一定范圍的元素。,還可以使用Clear方法從ArrayList中移除所有元素
15、。例如:01 ArrayList al = new ArrayList(20); //聲明一個接受20個元素的ArrayList02 al.AddRange(new string[6] { “元素1”, “元素2”, “元素3”, “元素4”, “元素5”,”元素6” });//添加元素03 //調(diào)用Remove方法刪除元素, 從ArrayList中移除特定對象的第一個匹配項,注意是第一個04 al.Remov
16、e(“元素2”); //調(diào)用Remove方法刪除指定索引位置元素05 //調(diào)用RemoveAt方法刪除指定索引位置元素6 al.RemoveAt(2);//調(diào)用RemoveAt方法刪除指定索引位置元素067 //調(diào)用RemoveRange方法刪除指定范圍的元素8 al.RemoveRange(3, 2);//調(diào)用RemoveRange方法刪除指定范圍的元素079 al.Clear();//清除所有元
17、素,4. 排序,可使用Sort方法對ArrayList集合中的元素進(jìn)行排序。Sort有三種重載方法。使用集合元素的比較方式進(jìn)行排序:public virtual void Sort();使用自定義比較器進(jìn)行排序:public virtual void Sort(IComparer comparer);,,使用自定義比較器進(jìn)行指定范圍的排序:public virtual void Sort(int index, int cou
18、nt, IComparer comparer)例如使用集合元素的比較方式進(jìn)行排序的代碼如下:01 ArrayList al = new ArrayList();//聲明一個ArrayList對象02 al.AddRange(new string[8] { “Array1”, “Array2”, “Array6”, “Array5”, “Array4” });//添加元素03 al.Sort(); //對A
19、rrayList集合中的元素進(jìn)行排序,5. 查找ArrayList中的集合元素,為了在數(shù)組列表中查找元素,最常使用的是IndexOf或LastIndexOf方法,另外,還可以使用BinarySearch方法執(zhí)行搜索。IndexOf方法從前向后搜索指定的字符串,如果找到,返回匹配的第一項的自0開始的索引,否則,返回-1。LastIndexOf方法從后向前搜索指定的字符串,如果找到,返回匹配的最后一項的自0開始的索引,否則,返回-1。這兩
20、個方法各自都有三個重載版本,表示從指定的索引處開始搜索或者是從指定索引處搜索指定長度的字符串。,6. ArrayList的遍歷,ArrayList內(nèi)部維護著一個數(shù)組,可以通過下標(biāo)進(jìn)行訪問,而且ArrayList實現(xiàn)了IEnumerable接口,因此,要遍歷集合,可以使用for或foreach方法。下面的代碼示例演示了如何使用for和foreach進(jìn)行集合元素遍歷。,01 ArrayList al = new ArrayLis
21、t(new string[6] { “元素1”, “元素2”, “元素3”, “元素4”, “元素5” });02 //使用for遍歷ArrayList3 for (int i = 0; i <= al.Count - 1; i++)//使用for遍歷ArrayList034 { Console.Write(al[i]); } //輸出ArrayList中的每個元素 045
22、 //使用foreach遍歷6 foreach (object s in al)//使用foreach遍歷057 { Console.Write(s); } //輸出ArrayList中的每個元素,【范例6-1】 利用ArrayList編寫一個管理客戶地址薄的應(yīng)用程序,用來管理客戶的地址信息。?在Visual Studio 2008中新建C#控制臺程序,項目名為“CustomerInfo
23、“,添加一個新類到項目中,類名為CustomerInfo,表示客戶。CustomerInfo.cs代碼如下:?除了使用集合元素默認(rèn)的比較器進(jìn)行排序外,可以傳遞實現(xiàn)IComparer接口的類,按自定義的排序邏輯進(jìn)行排序。下面實現(xiàn)按照客戶姓名進(jìn)行排序的接口實現(xiàn)代碼。添加類CustomerNameCompare,在CustomerNameCompare.cs中添加代碼如下。?在Program的Main中添加測試代碼如下。,第6章特殊的
24、類—集合與泛型,? 集合? ArrayList類? HashTable類? 泛型,6.3.1HashTable類介紹,在ArrayList集合中,可以使用索引訪問元素,如果不能確切知道索引的值,訪問就比較困難。HashTable稱為哈希表,和ArrayList不同它利用鍵/值來存儲數(shù)據(jù),在哈希表中,每個元素都是一個鍵/值對,并且是一一對應(yīng)的,通過“鍵”就可以得到“值”。如果存儲電話號碼,通常是姓名和電話號碼存在一起,存儲
25、時把姓名當(dāng)作鍵,號碼作為值,通過姓名即可查到電話號碼,這就是一個典型的哈希表存儲方式。,6.3.2 HashTable類的使用,在HashTable內(nèi)部維護著一個哈希表。內(nèi)部哈希表為插入到其中HashTable的每個鍵進(jìn)行哈希編碼,在后續(xù)的檢索操作中,通過哈希編碼代碼,可以遍歷所有元素。這種方法為檢索搜尋操作提供了較佳的性能。在.NET中,鍵和值可以是任何對象,例如字符串、自定義類等。在后臺,當(dāng)插入鍵值對到HashTable中時,Ha
26、shTable使用每個鍵所引用對象的GetHashCode()方法,獲取一個哈希編碼,存入HashTable中。,,哈希表常用的屬性和方法如下表所示。屬性名稱屬性說明Count 獲取包含在Hashtable中的鍵/值對的數(shù)目Keys 獲取包含Hashtable中的所有鍵的集合Values獲取包含Hashtable中的所有值的集合方法名稱方法說明Add 將帶有指定鍵和值的元素添加到Hashtable中。Cle
27、ar 從Hashtable中移除所有元素Contains 確定Hashtable是否包含特定鍵。GetEnumerator返回IDictionaryEnumerator,可以遍歷Hashtable。Remove 從Hashtable中移除帶有指定鍵的元素。Hashtable類提供了15個重載的構(gòu)造函數(shù),比較常用的4種Hashtable構(gòu)造函數(shù)聲明如下。,,(1)使用默認(rèn)的初始容量、加載因子、哈希代碼提供程序和比較器來
28、初始化 Hashtable類的實例public Hashtable();(2)使用指定容量、默認(rèn)加載因子、默認(rèn)哈希代碼提供程序和比較器來初始化Hashtable類的實例public Hashtable(int capacity);(3)使用指定的容量,加載因子來初始化Hashtable類的實例public Hashtable(int capacity, float loadFactor);(4)通過將指定字典中的元素復(fù)制到新
29、的 Hashtable 對象中,初始化 Hashtable 類的一個新實例。新 Hashtable 對象的初始容量等于復(fù)制的元素數(shù),并且使用默認(rèn)的加載因子、哈希代碼提供程序和比較器public Hashtable(IDictionary d);,,01 static void Main(string[] args) 02 { 03 Hashtable ht = new Hashtable();//使用所有
30、默認(rèn)值構(gòu)建哈希表實例04 Hashtable ht1 = new Hashtable(20); );//指定哈希表實例的初始容量為20個元素05 Hashtable ht2 = new Hashtable(20, 0.8f); );//初始容量為20個元素,加載因子為0.806 Hashtable ht3 = new Hashtable(sl); );//傳入實現(xiàn)了IDictionary接口的參數(shù)創(chuàng)
31、建哈希表07 },,【范例6-2】Hashtable創(chuàng)建、初始化并執(zhí)行各種函數(shù)以及打印其鍵和值的例子.?新建控制臺應(yīng)用程序,,項目名為“HashDemo”,?在Program.cs的Main方法中輸入以下代碼。,第6章特殊的類—集合與泛型,? 集合? ArrayList類? HashTable類? 泛型,6.4.1泛型概述,什么是泛型?泛型是一種類型占位符,或稱之為類型參數(shù)。我們知道在一個方法中,一個變量
32、的值可以作為參數(shù),但其實這個變量的類型本身也可以作為參數(shù)。泛型允許我們在調(diào)用的時候再指定這個類型參數(shù)是什么。泛型就好比Word中的模板,在Word的模板中,提供了基本的文檔編輯內(nèi)容,在定義Word模板時,對具體編輯哪種類型的文檔是未知的。,在.NET中,泛型則提供了類、結(jié)構(gòu)、接口和方法的模板,泛型也可以看作是占位符,與定義Word模板時類似,定義泛型時的具體類型是未知的。在.net中,泛型能夠給我們帶來的兩個明顯好處是—“類型安全和減少
33、裝箱、拆箱”。例如在6.2節(jié)講述的ArrayList類中,所有的元素類型都為object類型。.NET中object類是所有類的基類,因此,ArrayList類能夠接受任何類型的值作為他的元素。當(dāng)使用ArrayList中的元素時,必須要進(jìn)行強制類型轉(zhuǎn)換將元素轉(zhuǎn)換為合適的元素類型。如果元素是值類型的值時,會引起CLR進(jìn)行拆箱和裝箱的操作,造成一定的性能開銷。而且,還必須小心處理類型轉(zhuǎn)換中可能出現(xiàn)的錯誤。例如,可以為ArrayList對
34、象添加了多個不同類型的元素值:,,01 ArrayList list = new ArrayList(); //創(chuàng)建一個ArrayList對象list02 list.Add(“這是一個字符型”); “);//添加一個字符串03 list.Add(8); );//添加一個整型04 list.Add(true); );//添加一個布爾型但是,在
35、很多場合應(yīng)用程序并不需要像上面的代碼那樣向一個ArrayList集合類中添加各種不同的類型。如果只需要處理同種類型的元素,比如整型,可以將ArrayList集合中的元素定義為確定的類型,或稱之為強類型。這樣,就可以減少類型轉(zhuǎn)換帶來的性能開銷,而且,也避免了類型轉(zhuǎn)換中可能會出現(xiàn)的錯誤。這種方式解決了以object作為參數(shù)的缺陷,而且工作得也還不錯。但是,如果還需要強類型字符串值、布爾值或其他的類型時,必須一一地實現(xiàn)這些強類型類,這些重復(fù)工
36、作顯然增加了代碼量。.NET 2.0中引入了泛型來處理這種形式的不足,經(jīng)由指定一個或多個類型占位符,在處理類型操作時,不用知道具體類型,而將確定具體類型的工作指定交由在運行時來實現(xiàn)。,6.4.2 使用泛型,使用泛型可以定義泛型類、泛型接口、泛型方法等。在System.Collections.Generic命名空間中包含幾個泛型集合類,List和Dictionary是其中非常重要的兩種,泛型接口IComparable、IComparer
37、在實際中也有很重要的作用。本節(jié)主要學(xué)習(xí)這些系統(tǒng)提供的泛型集合和接口的用法。,,1. 泛型集合List和泛型接口IComparer、IComparable泛型最重要的應(yīng)用就是集合操作,使用泛型集合可以提高代碼重用性、類型安全和更佳的性能。List的用法和ArrayList很相似,List有更好的類型安全性,無須拆、裝箱。定義一個List泛型集合的語法如下:List 集合名=new List();在泛型定義中,泛型類型參數(shù)“”是必須
38、指定的,其中的T是定義泛型類時的占位符,其并不是一種類型,僅代表某種可能的類型。在定義時T會被使用的類型代替。泛型集合List中只能有一個參數(shù)類型,“”中的T可以對集合中的元素類型進(jìn)行約束。,,注意:泛型集合必須實例化,實例化時和普通類實例化時相同,必須在后面加上“()”。List的添加、刪除和檢索等方法和ArrayList相似,但是不需要像ArrayList那樣裝箱和拆箱。示例如下:01 List ls = new List(
39、); //創(chuàng)建泛型集合ls02 ls.Add(“泛型集合元素1”);//向泛型集合ls中添加元素03 ls.Add(“泛型集合元素2”);//向泛型集合ls中添加元素04 ls.Add(“泛型集合元素3”);//向泛型集合ls中添加元素,,【范例6-3】 改寫范例【6-1】,利用List編寫一個管理客戶地址薄的應(yīng)用程序。?在Visual Studio 2008中新建C#控制臺程序,項目名為“CustomerI
40、nfoList“,添加一個新類到項目中,類名為CustomerInfo,表示客戶,代碼和【范例6-1】。?使用IComparer泛型接口進(jìn)行實現(xiàn)按照客戶姓名進(jìn)行排序的方法。,2. 泛型集合Dictionary,在System.Collections.Generic命名空間中,與HashTable相對應(yīng)的泛型集合是Dictionary,其存儲數(shù)據(jù)的方式和哈希表相似,通過鍵/值來保存元素,并具有泛型的全部特征,編譯時檢查類型約束,讀取時
41、無須類型轉(zhuǎn)換。定義Dictionary泛型集合中的方法如下:Dictionary 泛型集合名=new Dictionary();,,例如在6.3.2節(jié)中【范例6-2】的例子中的HashTable定義可以改為使用Dictionary來實現(xiàn)。代碼如下:Dictionary openWith = new Dictionary();//創(chuàng)建泛型集合Dictionary對象這個Dictionary的聲明中,“”中的第一個string表示集
42、合中Key的類型,第二個string表示Value的類型。,6.4.3使用泛型的建議,泛型的優(yōu)點總結(jié)如下:。(1)性能高,使用泛型不需進(jìn)行類型轉(zhuǎn)換,可以避免裝箱和拆箱操作,能提高性能。(2)類型安全,泛型集合對其存儲對象進(jìn)行了類型約束,不是定義時聲明的類型,是無法存儲到泛型集合中的,保證了數(shù)據(jù)的類型安全。(3)代碼重用,使用泛型類型可以最大限度地重用代碼、保護類型的安全以及提高性能。,,在處理集合類時,如果遇到下列情況,則可以考
43、慮使用泛型類。(1)如需要對多種類型進(jìn)行相同的操作處理,則應(yīng)該使用泛型;。(2)如需要處理值類型,則使用泛型可以避免裝箱拆箱帶來的性能開銷;。(3)使用泛型可以在應(yīng)用程序編譯時發(fā)現(xiàn)類型錯誤,增強程序的健壯性;。(4)減少不必要的重復(fù)編碼,使代碼結(jié)構(gòu)更加清晰。,,再見!,6.6跟我上機,創(chuàng)建一個電話本,使用HashTable存儲電話信息,每個人的姓名和電話作為一個整體來存儲,使用姓名作為鍵值,可以根據(jù)姓名查詢電話號碼。使用泛型集
溫馨提示
- 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. 眾賞文庫僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 一類特殊模糊集合上的微分與積分.pdf
- 特殊類于型中毒
- 26853.競賽圖的外弧泛圈性及一類特殊圖的泛路問題
- 特殊集合上特征和的估計.pdf
- 一類高維Cantor型集合的交集的性質(zhì).pdf
- 泛型程序設(shè)計與模板
- 泛型編程與設(shè)計模式.pdf
- 泛型編程與c++標(biāo)準(zhǔn)庫
- 特殊矩陣類及特殊矩陣類上的矩陣方程的求解問題.pdf
- 15752.兩類中立型泛函微分方程的定性研究
- 脈沖泛函微分系統(tǒng)的集合穩(wěn)定性.pdf
- 一類高階中立型泛函微分方程的周期解.pdf
- 面向?qū)ο笳n程設(shè)計---集合類的設(shè)計與實現(xiàn)
- 一類特殊半線性橢圓型方程的多解問題.pdf
- enterprisearchitect表示java泛型
- 一類高階中立型泛函微分方程漸近行為的研究.pdf
- 一類滯后型泛函微分方程的Φ-變差穩(wěn)定性.pdf
- 泛型編程與c++標(biāo)準(zhǔn)庫[0001]
- 集合型住宅的空間分析
- 公司管理類報銷類excel表格集合
評論
0/150
提交評論