2014-02-21 3 views
2

중첩 된 사전과 가장 낮은 수준의 목록을 사용하는 데이터 구조를 만듭니다. - 즉, country --> customer --> purchased입니다VBA 사전에 저장된 배열 업데이트

Country, Customer, Purchased 
US, Alan, Lawnmower 
US, Alan, Hammer 
US, Karen, Donkey 
US, Simon, Mustang 
MX, Carl, Lawnmower 
MX, Alan, Donkey 
... 

내가 생각하고있는 데이터 구조가 dictionary --> dictionary --> array과 같다 : 여기에 내 데이터의 샘플입니다. 이 계획은 dictionary --> dictionary 조합 당 새로운 배열이 될 계획입니다.

그러나 배열을 업데이트하려고하면 dictionary --> dictionary 구조의 모든 하위 수준에 연결되어있는 것처럼 보입니다. 내가보고 기대하고있어 반면 ...

US --> Alan --> [Lawnmower, Hammer, Donkey] 
US --> Karen --> [Lawnmower, Hammer, Donkey] 

: 여기

US --> Alan --> [Lawnmower, Hammer] 
US --> Karen --> [Donkey] 

내가 시도하고있어 코드의 세 번째 행이 처리 된 후 즉, 다음과 같은 상황이됩니다 사용 :

i_p = UBound(purchased_array) 

Redim Preserve purchased_array(i_p + 1) 

purchased_array(i+p + 1) = item ' new item to add to the array 

dataset(country)(customer) = purchased_array 

그러나 이것은 dictionary --> dictionary 구조의 각 최하위 레벨에 의해 참조되는 기본적으로 동일한 배열을 초래한다.

내가 잘못하고있는 것에 대한 의견이 있으십니까?

+0

왜'사전 -> 사전 -> 배열', 왜'사전 -> 사전 -> 수집'? –

+0

''컬렉션 '은 키 데이터 구조라고 믿었습니까? 배열 대신 사용할 수 있을까요? –

+0

컬렉션 개체 지원'.Add (Item, [Key])'메서드를 지원하지만 키는 선택적입니다. 그래서, 당신은 그것을 생략 할 수 있습니다. 귀하의 경우 배열 대신 모음을 사용하는 것이 훨씬 더 간단합니다 –

답변

3

사전에 배열이있는 경우이를 수정하기 전에 사전에서 배열을 꺼내야합니다. 그럼 다시 넣어.

Sub Tester() 

Dim x As Long, y As Long 
Dim dict As New Scripting.Dictionary 
Dim d As Scripting.Dictionary 
Dim arr 

    For x = 1 To 3 
     Set d = New Scripting.Dictionary 
     For y = 1 To 3 
      d.Add "nextkey" & y, Array("A_" & x & "_" & y, _ 
             "B_" & x & "_" & y) 
     Next y 
     dict.Add "key" & x, d 
    Next x 

    Debug.Print Join(dict("key1")("nextkey1"), ", ") '>> A_1_1, B_1_1 

    'try to modify array while stored in dictionary... 
    dict("key1")("nextkey1")(1) = "newValue1" '<<< doesn't work! 

    Debug.Print Join(dict("key1")("nextkey1"), ", ") '>> A_1_1, B_1_1 

    'have to pull it out of the dictionary if you want to change it... 
    arr = dict("key1")("nextkey1") 
    arr(1) = "newValue2" 
    dict("key1")("nextkey1") = arr 

    Debug.Print Join(dict("key1")("nextkey1"), ", ") '>> A_1_1, newValue2 

End Sub 
+0

좋아요, 당신이 한 일을 따라한다고 생각합니다. 그러나'arr' 배열을 확장하려면 어떻게 될까요? 즉, 구매 한 열의 항목 수에 따라 증가/축소하는 동적 배열로 간주됩니다. –

+0

사전에 없으면 일반 배열처럼 사용할 수 있습니다. 확장하려면 문제가되지 않습니다. –

0

사전에는 쌍의 집합이 포함되어 있습니다. 또한 Dictionary의 키 목록은 고유해야합니다. Country & 고객 간의 관계가 포함 된 최상위 사전에 국가 또는 고객 모두 해당 표준에 의해 고유하지 않습니다. 그래서 나는 사전이 적절하다고 생각하지 않는다. 어쩌면 당신은 Dictionary -> Array -> Array을 시도 할 수 있습니다.