Доброго дня всем. Подскажите как правильно делать копию словарика. Я заполняю словарик, делаю копию. В копии удаляю ненужные мне элементы. Но они и в оригинальном словаре тоже удаляются. А мне он нужен целым и невредимым) Пример вот такой написал [vba]
Код
Sub qqq() Set dic1 = CreateObject("Scripting.Dictionary") arr = [a1:a30].Value For i = 1 To UBound(arr) dic1.Item(arr(i, 1)) = dic1.Item(arr(i, 1)) + 1 Next Set dic2 = CreateObject("Scripting.Dictionary") Set dic2 = dic1 qqqq 3, dic2 End Sub
Function qqqq(q As Integer, ByVal dic As Object) For Each k In dic.keys If dic.Item(k) <> q Then dic.Remove (k) Next If dic.Count > 0 Then ks = dic.keys qqqq = ks(0) End If End Function
[/vba]
Доброго дня всем. Подскажите как правильно делать копию словарика. Я заполняю словарик, делаю копию. В копии удаляю ненужные мне элементы. Но они и в оригинальном словаре тоже удаляются. А мне он нужен целым и невредимым) Пример вот такой написал [vba]
Код
Sub qqq() Set dic1 = CreateObject("Scripting.Dictionary") arr = [a1:a30].Value For i = 1 To UBound(arr) dic1.Item(arr(i, 1)) = dic1.Item(arr(i, 1)) + 1 Next Set dic2 = CreateObject("Scripting.Dictionary") Set dic2 = dic1 qqqq 3, dic2 End Sub
Function qqqq(q As Integer, ByVal dic As Object) For Each k In dic.keys If dic.Item(k) <> q Then dic.Remove (k) Next If dic.Count > 0 Then ks = dic.keys qqqq = ks(0) End If End Function
Sub qqq() Set dic1 = CreateObject("Scripting.Dictionary") Set dic2 = CreateObject("Scripting.Dictionary") arr = [a1:a30].Value For i = 1 To UBound(arr) dic1.Item(arr(i, 1)) = dic1.Item(arr(i, 1)) + 1 dic2.Item(arr(i, 1)) = dic2.Item(arr(i, 1)) + 1 Next ' Set dic2 = dic1 qqqq 3, dic2 End Sub
[/vba]
Привет! Наверно потому, что
Цитата
Set dic2 = dic1
т.е. это один и тот же объект [vba]
Код
Sub qqq() Set dic1 = CreateObject("Scripting.Dictionary") Set dic2 = CreateObject("Scripting.Dictionary") arr = [a1:a30].Value For i = 1 To UBound(arr) dic1.Item(arr(i, 1)) = dic1.Item(arr(i, 1)) + 1 dic2.Item(arr(i, 1)) = dic2.Item(arr(i, 1)) + 1 Next ' Set dic2 = dic1 qqqq 3, dic2 End Sub
Или после создания первого словаря по нему создайте второй [vba]
Код
Sub qqq() Dim dic1 As Object Dim dic2 As Object Set dic1 = CreateObject("Scripting.Dictionary") Set dic2 = CreateObject("Scripting.Dictionary") arr = [a1:a30].Value For i = 1 To UBound(arr) dic1.Item(arr(i, 1)) = dic1.Item(arr(i, 1)) + 1 Next a = dic1.keys b = dic1.items For i = 0 To UBound(a) dic2.Add a(i), b(i) Next For Each k In dic2.keys If dic2.Item(k) <> q Then dic2.Remove (k) Next End Sub
[/vba]
Или после создания первого словаря по нему создайте второй [vba]
Код
Sub qqq() Dim dic1 As Object Dim dic2 As Object Set dic1 = CreateObject("Scripting.Dictionary") Set dic2 = CreateObject("Scripting.Dictionary") arr = [a1:a30].Value For i = 1 To UBound(arr) dic1.Item(arr(i, 1)) = dic1.Item(arr(i, 1)) + 1 Next a = dic1.keys b = dic1.items For i = 0 To UBound(a) dic2.Add a(i), b(i) Next For Each k In dic2.keys If dic2.Item(k) <> q Then dic2.Remove (k) Next End Sub
не, в кучу мне не надо) котлеты отдельно, мухи отдельно(с) Потестировал заполнение словаря по другому словарю и по массивам ключей и значений массив данных 1048576 запустил по 10 раз каждый вариант
не, в кучу мне не надо) котлеты отдельно, мухи отдельно(с) Потестировал заполнение словаря по другому словарю и по массивам ключей и значений массив данных 1048576 запустил по 10 раз каждый вариант sboy
А какой смысл сначала создавать словарь, а потом резать его? Не проще сразу создать то, что нужно? И, кстати, основное время тратится на создание первого словаря (цикл по массиву), все остальное можно даже не считать, оно ничтожно Я бы все-таки сделал вот так [vba]
Код
Dim dic1 As Object Dim dic2 As Object Set dic1 = CreateObject("Scripting.Dictionary") Set dic2 = CreateObject("Scripting.Dictionary") n_ = 1048575 arr = Range("A1:A" & n_).Value With dic1 For i = 1 To n_ .Item(arr(i, 1)) = .Item(arr(i, 1)) + 1 Next For Each k In .keys If .Item(k) = 3 Then dic2.Item(k) = .Item(k) Next End With
[/vba] Но это уже как кому больше нравится, по времени работы разницы практически никакой
А какой смысл сначала создавать словарь, а потом резать его? Не проще сразу создать то, что нужно? И, кстати, основное время тратится на создание первого словаря (цикл по массиву), все остальное можно даже не считать, оно ничтожно Я бы все-таки сделал вот так [vba]
Код
Dim dic1 As Object Dim dic2 As Object Set dic1 = CreateObject("Scripting.Dictionary") Set dic2 = CreateObject("Scripting.Dictionary") n_ = 1048575 arr = Range("A1:A" & n_).Value With dic1 For i = 1 To n_ .Item(arr(i, 1)) = .Item(arr(i, 1)) + 1 Next For Each k In .keys If .Item(k) = 3 Then dic2.Item(k) = .Item(k) Next End With
[/vba] Но это уже как кому больше нравится, по времени работы разницы практически никакой_Boroda_
А какой смысл сначала создавать словарь, а потом резать его?
а вот эти слова заставили задуматься, и действительно смысла мало Решил задачу по-другому, перезаписал второй словарь наоборот (ключи стали значениями, а значения -ключами). И ничего резать не пришлось, при перезаписи все лишнее само отрезалось. У меня сразу появился словарь для всех нужных расчетных значений.
А какой смысл сначала создавать словарь, а потом резать его?
а вот эти слова заставили задуматься, и действительно смысла мало Решил задачу по-другому, перезаписал второй словарь наоборот (ключи стали значениями, а значения -ключами). И ничего резать не пришлось, при перезаписи все лишнее само отрезалось. У меня сразу появился словарь для всех нужных расчетных значений.sboy