VB中的Dictionary對(duì)象介紹小結(jié)_第1頁
VB中的Dictionary對(duì)象介紹小結(jié)_第2頁
VB中的Dictionary對(duì)象介紹小結(jié)_第3頁
VB中的Dictionary對(duì)象介紹小結(jié)_第4頁
VB中的Dictionary對(duì)象介紹小結(jié)_第5頁
已閱讀5頁,還剩4頁未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡介

1、VBA中Dictionary對(duì)象使用小結(jié)Dim dict' 創(chuàng)建DictionarySet dict = CreateObject("Scripting.Dictionary")' 增加項(xiàng)目dict.Add "A", 300dict.Add "B", 400dict.Add "C", 500' 統(tǒng)計(jì)項(xiàng)目數(shù)n = dict.Count' 刪除項(xiàng)目dict.Remove ("A")' 判斷字典中是否包含關(guān)鍵字dict.exists ("B"

2、)' 取關(guān)鍵字對(duì)應(yīng)的值,注意在使用前需要判斷是否存在key,否則dict中會(huì)多出一條記錄Value = dict.Item("B")' 修改關(guān)鍵字對(duì)應(yīng)的值,如不存在則創(chuàng)建新的項(xiàng)目dict.Item("B") = 1000dict.Item("D") = 800' 對(duì)字典進(jìn)行循環(huán)k = dict.keysv = dict.ItemsFor i = 0 To dict.Count - 1key = k(i)Value = v(i)MsgBox key & ValueNext' 刪除所有項(xiàng)目dict.

3、Removeall實(shí)例:Sub 宏1()Set dic = CreateObject("Scripting.Dictionary") '字典For i = 1 To 10000If Not i Like "*4*" Thendic.Add i, "" '如果不包含“1”End IfNextRange("a2").Resize(dic.Count, 1) = Application.WorksheetFunction.Transpose(dic.keys) '從A2單元開始向下放置End Su

4、bVB中的Dictionary對(duì)象核心歸納:1、更換鍵名,用obj.key("xx")="newxx"2、更換鍵值或訪問指定鍵:1、重設(shè)鍵值:obj.item("xx")="newxx",2、取得鍵值:response.write obj.item("xx")=" ,如果obj.item("xx")="newxx" 中的KEY鍵“xx”未設(shè)定時(shí),會(huì)在對(duì)象的后面增加一個(gè)鍵值對(duì)。3、獲得條目數(shù):obj.count (從1開始)4、增加鍵值對(duì):obj.

5、add key,value5、移除鍵:obj.remove("key") , obj.removeall()6、判定鍵是否存在:obj.Exists("key")7、遍歷:先把鍵和值各自賦給一個(gè)變量,構(gòu)成一維數(shù)組,再用FOR遍歷a=d.keysb=d.Items'For x=0 to d.count-1 '或 從上到下遍歷,F(xiàn)or x=d.Count-1 To 0 Step -1 '從下到上遍歷 wan : abc zuo : 10254 Response.write a(x) Response.write " : &q

6、uot; Response.write b(x) Response.write "<br />"Next8、用pareMode = 0(二進(jìn)制,默認(rèn),大小寫敏感)或pareMode = 1(文本,大小寫不區(qū)分,但不會(huì)后面的覆蓋前面)來指定比較模式,=簡單的理解:Scripting.Dictionary對(duì)象相當(dāng)于二維數(shù)組,但比二維數(shù)組更靈活,可以隨時(shí)操縱其中某個(gè)鍵,而二維數(shù)組還要遍歷。以下用一個(gè)簡單的案例來幫助理解:set d=server.CreateObject("scripting.dictionary")d.add "zuo&

7、quot;,21312d.add "wan","abc"response.write d.Count '計(jì)數(shù),從1開始Response.write "<br />"a=d.keysb=d.Items'For x=0 to d.count-1 '或 從上到下遍歷,F(xiàn)or x=d.Count-1 To 0 Step -1 '從下到上遍歷 wan : abc zuo : 10254 Response.write a(x) Response.write " : " Respons

8、e.write b(x) Response.write "<br />"NextResponse.write d.item("wan") '輸出指定的key值Response.write "<br />"d.item("wan")="新值"Response.write d.item("wan") '輸出指定的key值Response.write "<br />"d.key("wan")

9、="newwan" '更改鍵名'wan鍵名更改了,是否還有值?Response.write "執(zhí)行d.key(""wan"")=""newwan""后再輸出wan"Response.write d.item("wan") '無值輸出。但要注意: d.item("wan") 不存在,可用d.Exists("wan")檢測。Response.write "<br />輸出新名

10、稱newwan的值:"Response.write d.item("newwan") Response.write "<br />"Response.write d.Exists("newwan") '分析是否存在這個(gè)鍵True。d.Remove("newwan")Response.write "<br />"Response.write d.Exists("wan") '分析是否存在這個(gè)鍵True。Response.writ

11、e "<br />"For x=d.Count-1 To 0 Step -1 '從下到上遍歷 wan : abc zuo : 10254Response.write a(x)Response.write " : "Response.write b(x)Response.write "<br />"Next詳細(xì):許多Microsoft的編程語言,如Visual Basic、VBScript和Jscript,都提供集合(collection)??梢园鸭舷胂鬄閿?shù)組,可以使用其中內(nèi)建的函數(shù)完成存儲(chǔ)和操縱數(shù)據(jù)等

12、基本任務(wù)。無須擔(dān)心數(shù)據(jù)是在哪些行列,而是使用唯一的鍵進(jìn)行訪問。 VBScript和Jscript都提供類似的對(duì)象,通稱Scripting.Dictionary對(duì)象或Dictionary對(duì)象。它類似于二維數(shù)組,把鍵和相關(guān)條目的數(shù)據(jù)存放在一起。然而真正的面向?qū)ο蟮姆椒?,不?yīng)直接訪問數(shù)據(jù)條目,必須使用Dictionary對(duì)象支持的方法和屬性來實(shí)現(xiàn)。 創(chuàng)建和使用Dictionary對(duì)象 創(chuàng)建一個(gè)Dictionary對(duì)象的示例如下: In VBScript: Dim objMyData Set objMyData = Server.CreateObject(“Scripting.Dictionary”)

13、 /In Jscript: var objMyData = Server.CreateObject(Scripting.Dictionary); <!- Server-Side with an OBJECT element -> <OBJECT RUNAT=”SERVER” SCOPE=”PAGE” ID=”objMyData” PROGID=”Scripting.Dictionary”> </OBJECT> Dictionary對(duì)象還可用于客戶端的IE中。 1 Dictionary對(duì)象的成員概要 當(dāng)增加一個(gè)鍵/條目對(duì)時(shí),如果該鍵已存在;或者刪除一個(gè)鍵/條目

14、對(duì)時(shí),該關(guān)鍵字/條目對(duì)不存在,或改變已包含數(shù)據(jù)的Dictionary對(duì)象的CompareMode,都將產(chǎn)生錯(cuò)誤。 屬 性 說 明 CompareMode (僅用于VBScript)設(shè)定或返回鍵的字符串比較模式 Count 只讀。返回Dictionary里的鍵/條目對(duì)的數(shù)量 -從1開始,而不像數(shù)組從0開始計(jì)數(shù)Item(key) 設(shè)定或返回指定的鍵的值 Key(key) 設(shè)定鍵名值 方法說明 Add(key,item) 增加鍵/條目對(duì)到Dictionary Exists(key) 如果指定的鍵存在,返回True,否則返回False Items() 返回一個(gè)包含Dictionary對(duì)象中所有條目的數(shù)

15、組 Keys() 返回一個(gè)包含Dictionary對(duì)象中所有鍵的數(shù)組 Remove(key) 刪除一個(gè)指定的鍵/條目對(duì) RemoveAll() 刪除全部鍵/條目對(duì) 2 對(duì)Dictionary中增加和刪除條目 一旦得到一個(gè)新的(空的)Dictionary,可以對(duì)其添加條目,從中獲取條目以及刪除條目: In VBScript: objMyData.Add “MyKey”, “MyItem”objMyData.Add “YourKey”, ”YourItem”blnIsThere = objMyData.Exists(“MyKey”)strItem = objMyData.Item(“YourKey

16、”)strItem = objMyData.Remove(“MyKey”) objMyData.RemoveAll3 修改鍵或條目的值 可以通過修改鍵的值,或通過修改與特定的鍵關(guān)聯(lián)的條目的數(shù)據(jù),來改變存儲(chǔ)在Dictionary內(nèi)的數(shù)據(jù)。下面的代碼改變鍵為MyKey的條目中的數(shù)據(jù)。 ObjMyData.Item(“MyKey”) = “NewValue” In VBScript ObjMyData.Item(MyKey) = NewValue; / In JScript 如果指定的鍵在Dictionary未找到,將在Dictionary中后面位置創(chuàng)建一個(gè)以MyKey為鍵,以New Value為其

17、條目值的新的鍵/條目對(duì)。有意思的是,如果使用一個(gè)不存在的鍵來檢索條目,不僅得到一個(gè)空的字符串(這是可以想到的),而且還在Dictionary里添加一個(gè)新的鍵/條目對(duì),鍵即是指定的鍵,但條目的數(shù)據(jù)為空。 可以使用Key屬性僅改變鍵名的值而不改變與之對(duì)應(yīng)的條目的數(shù)據(jù)。將一個(gè)已存在的鍵MyKey改變?yōu)镸yNewKey,可以用: objMyData.Key(“MyKey”) = “MyNewValue” In VBScript objMyData.Item(MyKey) = MyNewValue; / In JScript 如果指定的鍵未找到,則產(chǎn)生運(yùn)行期錯(cuò)誤。 4 設(shè)置比較模式 Dictionary

18、的CompareMode屬性僅適用于VBScript,不能在JScript中使用。當(dāng)比較字符串鍵時(shí),允許指定比較的方式。兩個(gè)允許的值為BinaryCompare(0)和TextCompare(1)。BinaryCompare(0)為二進(jìn)制數(shù)對(duì)照(即區(qū)分大小寫);TextCompare(1)為文本對(duì)照(即不區(qū)分大小寫)。 5 遍歷Dictionary 研究Dictionary時(shí),有兩個(gè)方法和一個(gè)屬性需要特別注意,它們允許我們遍歷存儲(chǔ)在Dictionary里的所有鍵/條目對(duì)。Items方法用一個(gè)一維數(shù)組的形式返回Dictionary里所有的條目數(shù)據(jù),而keys方法用一個(gè)一維數(shù)組返回所有已存在的鍵值

19、。可以使用Count屬性得到鍵或條目的數(shù)量。 例如,可以使用下列代碼得到名稱為objMyData的Dictionary中所有的鍵和條目值。注意,雖然Count屬性保存了在Dictionary里的鍵/條目數(shù)量,但VBScript和JScript的數(shù)組總是從下標(biāo)0開始的。因此,數(shù)組下標(biāo)應(yīng)從0到Count-1。 In VBScript: arrKeys = objMyData.Keys Get all the keys into an array arrItems = objMyData.Items Get all the items into an array For intLoop = 0 To

20、 objMyData.Count 1 Iterate through the array StrThisKey = arrKeys(intLoop) This is the key value StrThisItem = arrItems(intLoop) This is the item (data) value Next / In JScript / Get VB-style arrays using the Keys() and Items() methods var arrKeys = new VBArray(objMyData.Keys().toArray(); var arrIte

21、ms = new VBArray(objMyData.Items().toArray(); for (intLoop = 0; intLoop < objMyData.Count; intLoop+) / Iterate through the arrays strThisKey = arrKeysintLoop; / This is the key value strThisItem = arrItemsintLoop; / This is the item (data) value 在VBScript里也可以使用For Each Next語句完成同樣的功能: arrKeys = ob

22、jMyData.Keys arrItems = objMyData.ItemsFor Each objItem in arrItems Response.Write objItem & “ = “ & arrItems(objItem) & “<BR>” Next 5.3.2 Dictionary對(duì)象示例 本書提供了一系列示例文件可用來試驗(yàn)?zāi)_本運(yùn)行時(shí)間庫的各種屬性。 本章代碼的缺省頁面提供了一系列可使用的VBScript示例鏈接。有些示例對(duì)JScript同樣有效。這些示例存放在Chapter05目錄下相應(yīng)的子目錄里,顯示的界面如圖5-2所示: 要查看Dict

23、ionary對(duì)象的運(yùn)行,在菜單頁面點(diǎn)擊第一個(gè)鏈接,打開名叫show_dictionary.asp的頁面。這個(gè)頁面顯示了我們提供的Dictionary對(duì)象的內(nèi)容,允許試驗(yàn)其屬性和方法。屏幕如圖5-3所示: 1 Dictionary的global.asa文件 隨Dictionary對(duì)象示例頁面提供的文件之一是global.asa。它創(chuàng)建并預(yù)先填充了一個(gè)會(huì)話層作用域的Dictionary對(duì)象,因此其內(nèi)容在頁面請求之間不會(huì)丟失。一般說來(考慮到可擴(kuò)展性),這不是一個(gè)理想的做法。在這個(gè)例子里,可以看到Dictionary的屬性和方法的效果。 如果在自己的服務(wù)器上下載并安裝示例,必須創(chuàng)建一個(gè)基于此glob

24、al.asa文件的虛擬應(yīng)用程序?;蛘邔⑵鋬?nèi)容添加到缺省站點(diǎn)的根文件夾中的global.asa文件里。在第3章講述了如何用向?qū)?chuàng)建虛擬應(yīng)用程序。然而對(duì)于本示例,創(chuàng)建一個(gè)虛擬應(yīng)用程序最簡單的方法是在Chapter05示例文件夾內(nèi)右擊dictionary子文件夾,在Properties對(duì)話框的Home Directory選項(xiàng)卡里,點(diǎn)擊Create按鈕,如圖5-4所示: 在這個(gè)global.asa文件里,代碼使用<OBJECT>元素創(chuàng)建一個(gè)會(huì)話層作用域的Scripting.Dictionary對(duì)象實(shí)例。然后在Session_onStart事件處理程序里將一系列值用Add方法放入Dictio

25、nary中,并將對(duì)Dictionary對(duì)象的引用指定給ASP會(huì)話變量MyDictionary: <OBJECT ID="objBookList" RUNAT="SERVER" SCOPE="SESSION" PROGID="Scripting.Dictionary"> </OBJECT> <SCRIPT LANGUAGE="VBScript" RUNAT="SERVER"> Sub Session_onStart() objBookList

26、.Add "2610", "Professional Active Server Pages 3.0" objBookList.Add "1274", "Instant JavaScript" objBookList.Add "2882", "Beginning ASP Components" objBookList.Add "1797", "Professional ASP Techniques" objBookList.Add &q

27、uot;1835", "AD0 2.0 Programmer's Reference" Set Session("MyDictionary") = objBookList End Sub </SCRIPT> 2 Dictionary示例頁面 在“Scripting.Dictionary Object”主頁面里,首要的任務(wù)是得到一個(gè)會(huì)話層作用域的Dictionary對(duì)象實(shí)例的引用。注意,這個(gè)引用是一個(gè)對(duì)象變量,因此必須在VBScript里使用Set關(guān)鍵字。 然后,檢查一下是否得到了一個(gè)對(duì)象(這是個(gè)好習(xí)慣),如果沒有正確地建立包

28、含global.asa文件的虛擬應(yīng)用程序,檢查一下問題出在哪里。你將看到我們自己的消息代替了ASP的錯(cuò)誤消息(但是注意,對(duì)于這一操作必須關(guān)閉缺省的錯(cuò)誤處理)。 <% on error resume next ' turn off error handling to test if object exists 'retrieve Dictionary object from user's session Set objMyData = Session("MyDictionary") If IsObject(objMyData) Then '

29、;found Dictionary object in Session %> <P><DIV CLASS="subhead">Iterating the Dictionary with Arrays</DIV> <% arrKeysArray = objMyData.Keys 'get all the keys into an array arrItemsArray = objMyData.Items 'get all the items into an array For intLoop = 0 To obj

30、MyData.Count - 1 'iterate through the array Response.Write "Key: <B>" & arrKeysArray(intLoop) & "</B> Value: <B>" _ & arrItemsArray(intLoop)& "</B><BR>" Next %> Other code and controls go here <% Else 'could no

31、t find Dictionary object in the session Response.Write "Dictionary object not available in global.asa for session" End If %> 顯示在頁面上的Dictionary內(nèi)容列表是使用Dictionary對(duì)象的Key和Items方法創(chuàng)建的兩個(gè)數(shù)組,可使用前面的代碼遍歷它們。 3 Dictionary頁面控件 在Dictionary的內(nèi)容列表下是一系列的HTML控件,可用于設(shè)定Dictionary對(duì)象的某些屬性和執(zhí)行各種方法。這些控件全部在一個(gè)<FOR

32、M>內(nèi),其ACTION屬性值是本頁面,所以窗體的內(nèi)容提交回本頁面。在前面的章節(jié)的示例里使用了同樣的技術(shù)。 在<FORM>段中,改變屬性或執(zhí)行一個(gè)方法是通過一個(gè)按鈕(沒有標(biāo)題)實(shí)現(xiàn)的。用于屬性和方法的值放入按鈕旁的文本框或列表框中。 該頁的第一個(gè)按鈕用于設(shè)定Dictionary里的條目的Key屬性。這里使用了一個(gè)下拉列表,可以選擇一個(gè)已經(jīng)存在的Key值。下面的代碼創(chuàng)建了頁面內(nèi)該部分的控件。為了填充列表,使用了另外一個(gè)遍歷Dictionary對(duì)象的技術(shù),即For Each Next語句。代碼如下: <FORM ACTION="<% = Request.Ser

33、verVariables("SCRIPT_NAME") %>" METHOD="POST"> <P><DIV CLASS="subhead">The Dictionary Properties</DIV> <INPUT TYPE="SUBMIT" NAME="cmdChangeKey" VALUE=" "> Dictionary.Key (" <SELECT NAME="lstCh

34、angeKey" SIZE="1"> <% For Each objItem in objMyData Response.Write "<OPTION>" & objItem Next %> </SELECT> ") = " <INPUT TYPE="TEXT" NAME="txtChangeKey" SIZE="15" VALUE="New Key Name"> " <

35、;BR> Other controls go here </FORM> 4 使用Dictionary的屬性和方法 在“Scription.Dictionary Object”頁面,點(diǎn)擊用來檢查并改變條目的Key屬性的按鈕,如圖5-5所示: 把窗體再次提交給頁面。該頁面包含一個(gè)腳本段,檢查被點(diǎn)擊的按鈕的值。它通過在Resquest.Form集合里查找按鈕的名字來斷定單擊的是哪個(gè)按鈕。如果發(fā)現(xiàn)一個(gè)對(duì)應(yīng)于cmdChangKey的值,則從列表中或文本框中得到相應(yīng)的值并用來改變Key屬性: 'look for a command sent from the FORM secti

36、on buttons If Len(Request.Form("cmdChangeKey") Then strKeyName = Request.Form("lstChangeKey") 'Existing key from list box strNewKey = Request.Form("txtChangeKey") 'New key value from text box objMyData.Key(strKeyName) = strNewKey 'Set key property of this it

37、em End If 頁面重新載入后,在Dictionary的內(nèi)容列表里能看到相應(yīng)的結(jié)果,如圖5-6所示: 頁面的其余代碼用來設(shè)定一個(gè)條目的Item屬性,或者執(zhí)行Dictionary對(duì)象的方法。下面是這些操作的代碼,每段代碼與演示Key屬性的代碼非常類似。每次都將結(jié)果顯示在Dictionary的內(nèi)容列表中: If Len(Request.Form("cmdChangeItem") Then strKeyName = Request.Form("lstChangeItem") 'Existing key from list box strNewVal

38、ue = Request.Form("txtChangeItem") 'New item value from text box objMyData.Item(strKeyName) = strNewValue 'Set the Item property End If If Len(Request.Form("cmdAdd") Then strKeyName = Request.Form("txtAddKey") 'New key value from text box strItemValue = Request.Form("txtAddItem") 'New item value from text box objMyData.Add strKeyN

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。

評(píng)論

0/150

提交評(píng)論