這一節我們來學習第二種集合,因為它的特性,可以提供一種相當有效率的搜尋方法,所以在實際項目中非常實用,它就是雜湊表。雜湊繼承了IDictionary介面,IDictionary介面提供了key(鍵)/value(值)集合設計模式,這種類集合中的每個一個對象都包含一個與它相對應的key,可以通過所指定的key找到集合中所對應的對象(value值),這個介面最重要之處在於定義了公用屬性Item、values、keys,其中Item根據指定的key返回集合中所對應的值,values用來返回集合中所有的對象元素,keys則返回集合中的所以key,現在你們就把key想象成存放值的“索引值”,通過這個“索引值”可以找到值。除了雜湊表有這種索引值對的訪問機制外,下一節我們也將學習到一種SortList 類,它是鍵/值條目和一個ArrayList集合的組合體,實現了二元搜尋,效能更加強大。接下來,我們就來理解一下什麼是索引值對的訪問機制,同時利用執行個體理解雜湊與HashTable類。
雜湊提供了一種類似字典的資料結構,原理是通過雜湊函數是一個映象,即:將關鍵字的集合映射到某個地址集合上,它的設定很靈活,只要這個地址集合的大小不超出允許範圍即可。將集合中元素的key值經過雜湊函數轉換成對應表格中的索引值,該類的表格稱為雜湊表,通過雜湊函數的使用,索引值對應到一個稱為雜湊碼的值,再通過這個雜湊碼形成的索引地址,找到指定的對象元素即value值。下面我們來看一下雜湊的知識要點:
雜湊表是鍵/值對的集合 ,這些索引值對根據鍵的雜湊碼進行組織,根據鍵可以尋找到相應的值。
這個要點我就不再解釋了,你們要記住的是,對雜湊的操作內部機制實質上都是對鍵的操作。
鍵不可為空或重複,value值可以。鍵、值可以為任意資料類型。
因為是對鍵的操作,所以就要求key值的唯一性,同時任何資料類型都可以存放在雜湊表中,而且對索引值對的操作也是嚴格根據其資料類型進行的。比如key值是整型1和字串類型的1,所尋找的value值的索引地址是不同的,這一點必須嚴格執行。
動態存放鍵/值對,容量根據實際需要自動增加。
HashTable類所建立的集合對象,容量也是依據需要而自動增加的,它的擴充會比ArrayList更加科學,不會成倍增長,而是根據載入因子來決定,這個因子決定集合在填充多少元素時,才繼續擴充其容量。
定義雜湊表對象的文法是Hashtable hstb = new Hashtable( );
常用的屬性
hstb.Count雜湊表中索引值對的元素個數 ,這兩種的用法和ArrayList相同,我們著重理解的是下面兩個HashTable類的屬性:
hstb.keys取得集合中的索引值集合; hstb. Values返回相對的數值集合對象。這兩個都是根據對象的元素得來的,是唯讀屬性,無法修改它們的結果。
常用方法
增加元素-在增加雜湊表元素的時候,有兩種方式,第一種是hstb.Add(key,value)一定要索引值對的形式同時增加用“,”隔開;第二種是通過鍵擷取值的形式添 加,同時這種格式也可以修改指定的鍵中的值,然後儲存在雜湊對象hstb中,格式是hstb[key]=value;應注意鍵和值的資料類型。
刪除元素-刪除元素用兩種hstb.Clear();全部刪除,第二種是根據鍵刪除元素hstb.Remove(key);
尋找元素- hstb. Contains(key)、 hstb.ContainsKey(key)查看是否包含指定的鍵,
hstb.ContainsValue(Value)是否包含指定的值,返回的都是true或false,體現查詢結果。
遍曆元素-遍曆有兩種形式,第一種:雜湊的元素是一個索引值對,DictionaryEntry類型是一個索引值對的集合,使用這個類型的對象來進行遍曆hstb對象
如: foreach (DictionaryEntry jzd in hstb ) 遍曆出的對象是一個雜湊的索引值對,然後利用jzd .Key取得鍵 ,jzd .Value取得值。
第二種遍曆是遍曆出keys或Values的集合的每個鍵或值,如 foreach( object k in hstb .Keys )或foreach( object v in hstb .Values )
注意:因為鍵或值的資料類型可以為任意類型,所以遍曆出集合後,存放鍵或值的變數的資料類型最好為object型,此類型包含任何一個類型。
在雜湊類中,一定的按照鍵的資料類型和索引值的排列原則,這就決定了無法對元素進行排序,因此我們不能通過特定順序取得指定的元素。下面我們通過幾個例子和結果給大家形象的示範一下雜湊表的屬性和方法的使用。
1 Hashtable hstb = new Hashtable();
2 Console.WriteLine("正在給hstb集合增加元素!請注意鍵和值的資料類型!");
3 hstb.Add(1, 11); //值的類型是整數型
4 hstb.Add("1", "我的鍵是字串1");
5 hstb.Add(5, "我的鍵是整型5,比你們大,應該先顯示");
6 hstb[3] = "我是用擷取方式賦值的";
7 Console.WriteLine("hstb集合增加{0}個元素!",hstb .Count);
8
9 Console.WriteLine("使用遍曆出索引值對變數方法,結果如下:");
10
11 Console.WriteLine("\t鍵\t值");
12 foreach (DictionaryEntry jzd in hstb)
13 {
14 Console.WriteLine("\t{0}\t{1}", jzd.Key, jzd.Value);
15 }
16
運行結果如下
正在給hstb集合增加元素!請注意鍵和值的資料類型!
hstb集合增加4個元素!
使用遍曆出索引值對變數方法,結果如下:
鍵 值
5 我的鍵是整型5,比你們大,應該先顯示
3 我是用擷取方式賦值的
1 我的鍵是“1”
1 11
請按任意鍵繼續. . .
接下來我們接著上面的例子加入以下代碼示範一下修改索引值為3的元素值,然後利用鍵集合遍曆出鍵和值。
Console.WriteLine("正在修改鍵為3的元素值!");
hstb[3] = "擷取方式也可以修改你的值,哈哈!";
Console.WriteLine("使用鍵集合遍曆出鍵和值");
Console.WriteLine("\t鍵\t值");
foreach (object k in hstb.Keys)
{
Console.WriteLine("\t{0}\t{1}", k, hstb[k]);
}
遍曆出k後,k存放的是元素的鍵,再通過鍵擷取值。
運行結果對比如下:
運行結果對比如下:
正在給hstb集合增加元素!請注意鍵和值的資料類型!
hstb集合增加4個元素!
使用遍曆出索引值對變數方法,結果如下:
鍵 值
5 我的鍵是整型5,比你們大,應該先顯示
3 我是用擷取方式賦值的
1 我的鍵是“1”
1 11
正在修改鍵為3的元素值!
使用鍵集合遍曆出鍵和值
鍵 值
5 我的鍵是整型5,比你們大,應該先顯示
3 擷取方式也可以修改你的值,哈哈!
1 我的鍵是“1”
1 11
請按任意鍵繼續. . .
看一下 鍵為3的元素值被修改了,接下來,我們示範按照鍵刪除元素,再使用值集合遍曆出元素值,注意:這種遍曆是得不到元素鍵的值的,原因就是雜湊碼是按照鍵進行組織的,我們現在接著在上面的例子中加入如下代碼:
Code
Console.WriteLine("正在刪除鍵為整型1的元素");
hstb.Remove(1); //刪除鍵=1的元素
Console.WriteLine("使用值的集合遍曆雜湊");
Console.WriteLine("\t鍵\t值");
foreach (object v in hstb.Values )
{
Console.WriteLine("\t \t{0}", v);
}運行結果將只截取上部分代碼進行對比。
正在修改鍵為3的元素值!
使用鍵集合遍曆出鍵和值
鍵 值
5 我的鍵是整型5,比你們大,應該先顯示
3 擷取方式也可以修改你的值,哈哈!
1 我的鍵是“1”
1 11
正在刪除鍵為整型1的元素
使用值的集合遍曆雜湊
鍵 值
我的鍵是整型5,比你們大,應該先顯示
擷取方式也可以修改你的值,哈哈!
我的鍵是“1”
請按任意鍵繼續. . .
通過下面的例子,相信對它的使用你們已經熟悉了,下面我留一道作業題運行結果
利用雜湊表建立一個學員管理系統
歡迎進入0122班學員登記系統
========================================
請選擇如下操作
A:添加 B:查詢 C:刪除 D:修改 E:退出系統
a
請輸入學號為:1
請輸入學生的姓名:唐老鴨
*******************************
請選擇如下操作
A:添加 B:查詢 C:刪除 D:修改 E:退出系統
a
請輸入學號為:2
請輸入學生的姓名:蠟筆小新
*******************************
請選擇如下操作
A:添加 B:查詢 C:刪除 D:修改 E:退出系統
b
按學號尋找請選A,按姓名尋找請選B
a
請輸入要查詢的學號:
1
學生姓名為:唐老鴨
A:繼續查詢 B:退出查詢
b
========================================
請選擇如下操作
A:添加 B:查詢 C:刪除 D:修改 E:退出系統
d
這個作業比較簡單,學號用鍵來存放,值存放的是一個變數姓名,正常情況下,值會以一個數組或動態數組的形式存放更多的資訊,如:年齡、連絡方式等,然後通過Value值中數組的索引尋找單個資訊,實現修改等操作,同時這種用法也是實際項目中的常用做法,比如網上商城,增加一條商品資訊,常會採用雜湊表來實現功能。下一節我們要來學習二元搜尋和sortlist類。