日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程语言 > C# >内容正文

C#

(教学思路 C#集合二)哈希表

發(fā)布時間:2023/12/19 C# 54 豆豆
生活随笔 收集整理的這篇文章主要介紹了 (教学思路 C#集合二)哈希表 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

????? 這一節(jié)我們來學(xué)習(xí)第二種集合,因?yàn)樗奶匦?#xff0c;可以提供一種相當(dāng)有效率的搜索方法,所以在實(shí)際項(xiàng)目中非常實(shí)用,它就是哈希表。哈希繼承了IDictionary接口,IDictionary接口提供了key(鍵)/value(值)集合設(shè)計(jì)模式,這種類集合中的每個一個對象都包含一個與它相對應(yīng)的key,可以通過所指定的key找到集合中所對應(yīng)的對象(value值),這個接口最重要之處在于定義了公共屬性Item、values、keys,其中Item根據(jù)指定的key返回集合中所對應(yīng)的值,values用來返回集合中所有的對象元素,keys則返回集合中的所以key,現(xiàn)在你們就把key想象成存放值的“索引值”,通過這個“索引值”可以找到值。除了哈希表有這種鍵值對的訪問機(jī)制外,下一節(jié)我們也將學(xué)習(xí)到一種SortList 類,它是鍵/值條目和一個ArrayList集合的組合體,實(shí)現(xiàn)了二元搜索,性能更加強(qiáng)大。接下來,我們就來理解一下什么是鍵值對的訪問機(jī)制,同時利用實(shí)例理解哈希與HashTable類。

?????? 哈希提供了一種類似字典的數(shù)據(jù)結(jié)構(gòu),原理是通過哈希函數(shù)是一個映象,即:將關(guān)鍵字的集合映射到某個地址集合上,它的設(shè)置很靈活,只要這個地址集合的大小不超出允許范圍即可。將集合中元素的key值經(jīng)過哈希函數(shù)轉(zhuǎn)換成對應(yīng)表格中的索引值,該類的表格稱為哈希表,通過哈希函數(shù)的使用,鍵值對應(yīng)到一個稱為哈希碼的值,再通過這個哈希碼形成的索引地址,找到指定的對象元素即value值。下面我們來看一下哈希的知識要點(diǎn):

哈希表是鍵/值對的集合 ,這些鍵值對根據(jù)鍵的哈希代碼進(jìn)行組織,根據(jù)鍵可以查找到相應(yīng)的值。

這個要點(diǎn)我就不再解釋了,你們要記住的是,對哈希的操作內(nèi)部機(jī)制實(shí)質(zhì)上都是對鍵的操作。


鍵不能為空或重復(fù),value值可以。鍵、值可以為任意數(shù)據(jù)類型。

因?yàn)槭菍︽I的操作,所以就要求key值的唯一性,同時任何數(shù)據(jù)類型都可以存放在哈希表中,而且對鍵值對的操作也是嚴(yán)格根據(jù)其數(shù)據(jù)類型進(jìn)行的。比如key值是整型1和字符串類型的1,所查找的value值的索引地址是不同的,這一點(diǎn)必須嚴(yán)格執(zhí)行。


動態(tài)存放鍵/值對,容量根據(jù)實(shí)際需要自動增加。

HashTable類所創(chuàng)建的集合對象,容量也是依據(jù)需要而自動增加的,它的擴(kuò)充會比ArrayList更加科學(xué),不會成倍增長,而是根據(jù)加載因子來決定,這個因子決定集合在填充多少元素時,才繼續(xù)擴(kuò)充其容量。

定義哈希表對象的語法是Hashtable hstb = new Hashtable(?);

常用的屬性
???????hstb.Count哈希表中鍵值對的元素個數(shù)?,這兩種的用法和ArrayList相同,我們著重理解的是下面兩個HashTable類的屬性:

?????? hstb.keys取得集合中的鍵值集合; hstb. Values返回相對的數(shù)值集合對象。這兩個都是根據(jù)對象的元素得來的,是只讀屬性,無法修改它們的結(jié)果。
常用方法

增加元素-在增加哈希表元素的時候,有兩種方式,第一種是hstb.Add(key,value)一定要鍵值對的形式同時增加用“,”隔開第二種是通過鍵獲取值的形式添? 加,同時這種格式也可以修改指定的鍵中的值,然后存儲在哈希對象hstb中,格式是hstb[key]=value;應(yīng)注意鍵和值的數(shù)據(jù)類型。
????????????
刪除元素-刪除元素用兩種hstb.Clear();全部刪除,第二種是根據(jù)鍵刪除元素hstb.Remove(key);
查找元素- hstb.?Contains(key)、 hstb.ContainsKey(key)查看是否包含指定的鍵,
???????????????hstb.ContainsValue(Value)是否包含指定的值,返回的都是true或false,體現(xiàn)查詢結(jié)果。

遍歷元素-遍歷有兩種形式,第一種:哈希的元素是一個鍵值對,DictionaryEntry類型是一個鍵值對的集合,使用這個類型的對象來進(jìn)行遍歷hstb對象

?????????????????????????????????如:?foreach (DictionaryEntry ?jzd? in ?hstb ) 遍歷出的對象是一個哈希的鍵值對,然后利用jzd .Key取得鍵 ,jzd .Value取得值。

??????????????第二種遍歷是遍歷出keys或Values的集合的每個鍵或值,如?? foreach( object k in hstb .Keys? )或foreach( object?v in hstb .Values? )

??????????????? 注意:因?yàn)殒I或值的數(shù)據(jù)類型可以為任意類型,所以遍歷出集合后,存放鍵或值的變量的數(shù)據(jù)類型最好為object型,此類型包含任何一個類型。

???????? 在哈希類中,一定的按照鍵的數(shù)據(jù)類型和鍵值的排列原則,這就決定了無法對元素進(jìn)行排序,因此我們不能通過特定順序取得指定的元素。下面我們通過幾個例子和結(jié)果給大家形象的演示一下哈希表的屬性和方法的使用。

?

?1????????????Hashtable?hstb?=?new?Hashtable();
?2????????????Console.WriteLine("正在給hstb集合增加元素!請注意鍵和值的數(shù)據(jù)類型!");??????
?3????????????hstb.Add(1,?11);???????????????????????????????????????????????//值的類型是整數(shù)型
?4????????????hstb.Add("1",?"我的鍵是字符串1");
?5????????????hstb.Add(5,?"我的鍵是整型5,比你們大,應(yīng)該先顯示");
?6????????????hstb[3]?=?"我是用獲取方式賦值的";
?7????????????Console.WriteLine("hstb集合增加{0}個元素!",hstb?.Count);
?8
?9????????????Console.WriteLine("使用遍歷出鍵值對變量方法,結(jié)果如下:");
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

? 運(yùn)行結(jié)果如下正在給hstb集合增加元素!請注意鍵和值的數(shù)據(jù)類型!
hstb集合增加4個元素!
使用遍歷出鍵值對變量方法,結(jié)果如下:
??????? 鍵????? 值
??????? 5?????? 我的鍵是整型5,比你們大,應(yīng)該先顯示
??????? 3?????? 我是用獲取方式賦值的
??????? 1?????? 我的鍵是“1”
??????? 1?????? 11
請按任意鍵繼續(xù). . .

?接下來我們接著上面的例子加入以下代碼演示一下修改鍵值為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存放的是元素的鍵,再通過鍵獲取值。

?運(yùn)行結(jié)果對比如下:

?

運(yùn)行結(jié)果對比如下:正在給hstb集合增加元素!請注意鍵和值的數(shù)據(jù)類型!
hstb集合增加4個元素!
使用遍歷出鍵值對變量方法,結(jié)果如下:
??????? 鍵????? 值
??????? 5?????? 我的鍵是整型5,比你們大,應(yīng)該先顯示
??????? 3?????? 我是用獲取方式賦值的
??????? 1?????? 我的鍵是“1”
??????? 1?????? 11
正在修改鍵為3的元素值!
使用鍵集合遍歷出鍵和值
??????? 鍵????? 值
??????? 5?????? 我的鍵是整型5,比你們大,應(yīng)該先顯示
??????? 3?????? 獲取方式也可以修改你的值,哈哈!
??????? 1?????? 我的鍵是“1”
??????? 1?????? 11
請按任意鍵繼續(xù). . .

??看一下 鍵為3的元素值被修改了,接下來,我們演示按照鍵刪除元素,再使用值集合遍歷出元素值,注意:這種遍歷是得不到元素鍵的值的,原因就是哈希代碼是按照鍵進(jìn)行組織的,我們現(xiàn)在接著在上面的例子中加入如下代碼:

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);
????????????}
運(yùn)行結(jié)果將只截取上部分代碼進(jìn)行對比。正在修改鍵為3的元素值!
使用鍵集合遍歷出鍵和值
??????? 鍵????? 值
??????? 5?????? 我的鍵是整型5,比你們大,應(yīng)該先顯示
??????? 3?????? 獲取方式也可以修改你的值,哈哈!
??????? 1?????? 我的鍵是“1”
??????? 1?????? 11
正在刪除鍵為整型1的元素
使用值的集合遍歷哈希
??????? 鍵????? 值
??????????????? 我的鍵是整型5,比你們大,應(yīng)該先顯示
??????????????? 獲取方式也可以修改你的值,哈哈!
??????????????? 我的鍵是“1”
請按任意鍵繼續(xù). . .

?通過下面的例子,相信對它的使用你們已經(jīng)熟悉了,下面我留一道作業(yè)題運(yùn)行結(jié)果如圖:

?

利用哈希表建立一個學(xué)員管理系統(tǒng)歡迎進(jìn)入0122班學(xué)員登記系統(tǒng)
========================================
請選擇如下操作
A:添加? B:查詢? C:刪除? D:修改? E:退出系統(tǒng)
a
請輸入學(xué)號為:1
請輸入學(xué)生的姓名:唐老鴨
*******************************
請選擇如下操作
A:添加? B:查詢? C:刪除? D:修改? E:退出系統(tǒng)
a
請輸入學(xué)號為:2
請輸入學(xué)生的姓名:蠟筆小新
*******************************
請選擇如下操作
A:添加? B:查詢? C:刪除? D:修改? E:退出系統(tǒng)
b
按學(xué)號查找請選A,按姓名查找請選B
a
請輸入要查詢的學(xué)號:
1
學(xué)生姓名為:唐老鴨
A:繼續(xù)查詢?? B:退出查詢
b
========================================
請選擇如下操作
A:添加? B:查詢? C:刪除? D:修改? E:退出系統(tǒng)
d

?這個作業(yè)比較簡單,學(xué)號用鍵來存放,值存放的是一個變量姓名,正常情況下,值會以一個數(shù)組或動態(tài)數(shù)組的形式存放更多的信息,如:年齡、聯(lián)系方式等,然后通過Value值中數(shù)組的索引查找單個信息,實(shí)現(xiàn)修改等操作,同時這種用法也是實(shí)際項(xiàng)目中的常用做法,比如網(wǎng)上商城,增加一條商品信息,常會采用哈希表來實(shí)現(xiàn)功能。下一節(jié)我們要來學(xué)習(xí)二元搜索和sortlist類。

?

?

?

?

?

轉(zhuǎn)載于:https://www.cnblogs.com/wangfang224120999/archive/2008/10/15/1309635.html

總結(jié)

以上是生活随笔為你收集整理的(教学思路 C#集合二)哈希表的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。