Предотвращение цикла от обновления всех значений словаря - PullRequest
0 голосов
/ 25 мая 2018

Уже несколько недель гуглю и пробую, но не нашел решения.

У меня есть цикл, который просматривает список записей и пытается составить из них словарь.Мой цикл сначала проверяет, существует ли ключ в нашем главном словаре - если нет, он создает ключ и требуемые под-словари - затем проверяет, какое значение под-словаря необходимо обновить.Ниже приведено упрощение кода.

У меня есть следующие данные в таблице Excel:

         A.                B.                C.                
1    product1            item1              used
2    product2            item2              new
3    product1            item3              removed
4    product1            item3              removed
5    product3            item5              new
6    product4            item2              new
7    product2            item1              used
8    product1            item3              new
9    product4            item2              removed
10   product5            item1              used

Так что теперь цикл должен пройти через каждую строку и определить для каждого продукта, сколько использовалось,новые и удаленные из каждого элемента есть.

Sub example()
Set test_dict = New Scripting.Dictionary

    For i = 1 To 10
        product_name = Cells(i, 1).Value
        item_name = Cells(i, 2).Value
        item_status = Cells(i, 3).Value

        If test_dict.Exists(product_name) = False Then
            Set item_dict = New Scripting.Dictionary
                item_dict.Add item_name, 0
            Set status_dict = New Scripting.Dictionary
                status_dict.Add "used", item_dict
                status_dict.Add "new", item_dict
                status_dict.Add "removed", item_dict
            test_dict.Add product_name, status_dict
        End If
        test_dict(product_name)(item_status)(item_name) = test_dict(product_name)(item_status)(item_name) + 1
    Next

End Sub

Это должно привести к примерно так:

test_dict
   | 
   |--> "product1" 
   |       |--> "used"  
   |       |      |-> "item1" = 1
   |       |      '-> "item3" = 0
   |       |-> "new"        
   |       |      |-> "item1" = 0
   |       |      '-> "item3" = 1
   |       '-> "removed"        
   |              |-> "item1" = 0
   |              '-> "item3" = 2    
   |--> "product2" (etc.)

Но по какой-то причине мой цикл продолжает обновлять все поддикты, то есть

test_dict
   | 
   |--> "product1" 
   |       |--> "used"  
   |       |      |-> "item1" = 1 *<-- correct value for item1*
   |       |      '-> "item3" = 2 *<-- false value for item3*
   |       |-> "new"        
   |       |      |-> "item1" = 1 *<-- false value for item1*
   |       |      '-> "item3" = 2 *<-- false value for item3*
   |       '-> "removed"        
   |              |-> "item1" = 1 *<-- false value for item1*
   |              '-> "item3" = 2 *<-- correct value for item3*   
   |--> "product2" (etc.)

Есть идеи, что я здесь не так делаю?Я проверял свой код снова и снова, я пробовал разные способы сделать то же самое, но каким-то образом я всегда сталкиваюсь с проблемой.

1 Ответ

0 голосов
/ 25 мая 2018
            status_dict.Add "used", item_dict
            status_dict.Add "new", item_dict
            status_dict.Add "removed", item_dict

Вы добавляете тот же объект словаря item_dict 3 раза здесь.

Так что если вы +1 в любом из 3 экземпляров, это повлияет на все из них.

Чтобы избежать этого, вам необходимо создать новый объект словаря для каждого из 3 экземпляров.

Редактировать: например

Set status_dict = New Scripting.Dictionary
For x = 1 To 3
    Set item_dict = New Scripting.Dictionary
    item_dict.Add item_name, 0

    strStatus = Choose(x, "used", "new", "removed")
    status_dict.Add strStatus, item_dict
Next x
test_dict.Add product_name, status_dict
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...