2011-03-23 73 views
3

比方說,我有兩個字典如下:相交兩個詞典

dict1 = {vessel1: [a, b, c], vessel2: [a, d, e], ...} 

dict2 = {operation1: [a, d], operation2: [a, e, b], ...} 

每個字典(dict1dict2)是字典的字典,讓abcdefg也是字典。

我要的是,例如,相交dict1(vessel1)dict2(operation2),並有一個結果解釋如下:

result_dictionary_of_intersection = [a, b] 

即,有一個只包含兩個vessel1和操作2有一個項目的結果字典。

記住:ab也是字典。

+1

無需在標題中添加標籤。 – Will 2011-03-23 13:53:02

+0

我不清楚你的意思是相交字典。如果你想使用一個像字典一樣的字典,請參閱:http://stackoverflow.com/questions/4749698/excel-vba-is-there-anything-like-javas-set-container-in-vba/4751101#4751101 。假設[a,b,c]和[a,e,b]代表列表(或集合,數組,等等),並且每個列表中的a,b等都是相同的字典*實例*,精細。 – jtolle 2011-03-23 16:04:30

回答

2

這將按照您的意願返回a和b字典。這假定vessel1字典的關鍵字是字符串「vessel1」,而operation2字典的關鍵字是「operation2」。您當然可以用代碼中的變量替換這些字符串文字。

Dim newDict As Dictionary 
Set newDict = New Dictionary 

For Each myKey In dict1("vessel1").Keys 

    If dict2("operation2").Exists(myKey) Then 
     newDict.Add myKey, dict2("operation2")(myKey) 
    End If 

Next 

如果你想了解你正在使用什麼dict1和dict2多一點的靈活性,你可以這樣來做(這實際上使代碼更可讀):

Set tmpDict1 = dict1("vessel1") 
Set tmpDict2 = dict2("operation2") 

Dim newDict As Dictionary 
Set newDict = New Dictionary 

For Each myKey In tmpDict1.Keys 

    If tmpDict2.Exists(myKey) Then 
     newDict.Add myKey, tmpDict2(myKey) 
    End If 

Next 
+1

我以爲VBA會有一個相交的內建方法,但我知道即使是一個簡單的排序列表函數也很難從VBA中獲得。 – 2011-03-23 16:11:57

+1

是的,VBA有一些非常嚴格的限制。 – Stewbob 2011-03-23 16:35:14

0

你可能會覺得這有幫助:

Sub testMe() 
Dim dict1 As New Dictionary 
Dim dict2 As New Dictionary 
Dim dict3 As New Dictionary 

Dim dictAll As New Dictionary 
Dim dictUnion As New Dictionary 
Dim dictTemp As New Dictionary 

dict1.Add "A", "A" 
dict1.Add "B", "B" 
dict1.Add "C", "C" 
dict1.Add "D", "D" 
dict1.Add "E", "E" 

dict2.Add "C", "C" 
dict2.Add "D", "D" 
dict2.Add "E", "E" 
dict2.Add "F", "F" 

dict3.Add "C", "C" 
dict3.Add "D", "D" 

dictAll.Add 1, dict1 
dictAll.Add 2, dict2 
dictAll.Add 3, dict3 

Dim var As Variant 
Dim i As Integer 

Set dictUnion = dictAll(1) 

For Each var In dictAll 
    Set dictTemp = dictAll(var) 
    Set dictUnion = intMe(dictUnion, dictTemp) 
Next 

'Set dictUnion = intMe(dict1, dict2) 
For Each var In dictUnion 
    Debug.Print var 
Next 

Set dict1 = Nothing 
Set dict2 = Nothing 
Set dict3 = Nothing 
Set dictAll = Nothing 
Set dictUnion = Nothing 
Set dictTemp = Nothing 

End Sub 

Function intMe(dict1 As Dictionary, dict2 As Dictionary) As Dictionary 
Dim dictInt As New Dictionary 
Dim var As Variant 
For Each var In dict1.Keys 
    If dict2.Exists(var) Then 
     dictInt.Add var, var 
    End If 
Next 
Set intMe = dictInt 
End Function 

Sub Intersect(dAll As Dictionary) 

Dim var As Variant 
Dim subVar As Variant 
Dim dict As Dictionary 

For Each var In dAll 

    If var <> "Account_LV0" And var <> "Account_LV1" Then 


     Set dict = dAll(var) 
     Debug.Print var & "|" & dict.Count 
     'For Each subVar In dict.Keys 
     ' Debug.Print subVar 
     'Next 
    End If 
Next 


End Sub