Здравствуйте. Заинтересовал вопрос - есть ли способы занести данные в dictionary без перебора массива (даже одномерного) ,выгрузка в массив значений и ключей есть,а вот заполнение ? Может кто нибудь пробовал разные способы, возможно с помощью какой нибудь функции.В инете сколько не искал - не нашел, только перебор.
Здравствуйте. Заинтересовал вопрос - есть ли способы занести данные в dictionary без перебора массива (даже одномерного) ,выгрузка в массив значений и ключей есть,а вот заполнение ? Может кто нибудь пробовал разные способы, возможно с помощью какой нибудь функции.В инете сколько не искал - не нашел, только перебор.megavlom
У Dictionary нет метода, производящего загрузку в него из массива, поэтому Вы и не можете его найти. Наверное, это потому, что у словаря всегда должна быть "нерушимая" пара "уникальный ключ<->значение". И поодиночке без нарушения этого его основополагающего принципа организовать ЗАГРУЗКУ в него нельзя. Да и цикл-то по массиву с добавлением элементов в словарь - штука очень быстрая и не сложная по коду. А, скажите, зачем это Вам нужно? Просто не представляю практического применения.
У Dictionary нет метода, производящего загрузку в него из массива, поэтому Вы и не можете его найти. Наверное, это потому, что у словаря всегда должна быть "нерушимая" пара "уникальный ключ<->значение". И поодиночке без нарушения этого его основополагающего принципа организовать ЗАГРУЗКУ в него нельзя. Да и цикл-то по массиву с добавлением элементов в словарь - штука очень быстрая и не сложная по коду. А, скажите, зачем это Вам нужно? Просто не представляю практического применения.Alex_ST
Мода не справляется? Ну можно перебором массива заносить в коллекцию, до первой ошибки. Если повезёт - будет быстро. Если повезёт - можно обойтись перебором ячеек Вам ведь только нужно понять, есть ли повторы?
Мода не справляется? Ну можно перебором массива заносить в коллекцию, до первой ошибки. Если повезёт - будет быстро. Если повезёт - можно обойтись перебором ячеек Вам ведь только нужно понять, есть ли повторы?Hugo
Ну если нужно количество - тогда конечно. Думаю, с коллекцией может быть быстрее - заносим все перебором массивов в коллекцию, считаем эрроры. А каким другим путём вы пошли ?
Ну если нужно количество - тогда конечно. Думаю, с коллекцией может быть быстрее - заносим все перебором массивов в коллекцию, считаем эрроры. А каким другим путём вы пошли ? Hugo
И это правильно Уже только взять миллион из массива в словарь перебором занимает значительное время - кажется у меня доходило до 30 секунд... Да. А на коллекции получается быстрее.
И это правильно Уже только взять миллион из массива в словарь перебором занимает значительное время - кажется у меня доходило до 30 секунд... Да. А на коллекции получается быстрее.Hugo
Провёл эксперимент - сгенерил миллион чисел вроде этого: 141623616791,714.
[vba]
Code
Sub million_collection() Dim tm!: tm = Timer Dim a(), x, cnt& a = [a1:a1000000].Value With New Collection On Error GoTo item_exists For Each x In a .Add 1, CStr(x) nxt: Next End With Debug.Print cnt & " collection: " & Timer - tm Exit Sub item_exists: cnt = cnt + 1 Resume nxt End Sub
Sub million_dictionary() Dim tm!: tm = Timer Dim a(), x, cnt&, t$ a = [a1:a1000000].Value With CreateObject("Scripting.Dictionary") .CompareMode = 1 For Each x In a t = x If Not .exists(t) Then .Item(t) = 0& Else cnt = cnt + 1 End If Next End With
Debug.Print cnt & " dictionary: " & Timer - tm End Sub
Sub million_dictionary2() Dim tm!: tm = Timer Dim a(), x, cnt&, t$ a = [a1:a1000000].Value With CreateObject("Scripting.Dictionary") .CompareMode = 1 For Each x In a t = x .Item(t) = 0& Next cnt = 1000000 - .Count End With
Debug.Print cnt & " dictionary2: " & Timer - tm End Sub
[/vba] Если в словарь заносить не строку, а число - то что-то я результата не дождался...
Провёл эксперимент - сгенерил миллион чисел вроде этого: 141623616791,714.
[vba]
Code
Sub million_collection() Dim tm!: tm = Timer Dim a(), x, cnt& a = [a1:a1000000].Value With New Collection On Error GoTo item_exists For Each x In a .Add 1, CStr(x) nxt: Next End With Debug.Print cnt & " collection: " & Timer - tm Exit Sub item_exists: cnt = cnt + 1 Resume nxt End Sub
Sub million_dictionary() Dim tm!: tm = Timer Dim a(), x, cnt&, t$ a = [a1:a1000000].Value With CreateObject("Scripting.Dictionary") .CompareMode = 1 For Each x In a t = x If Not .exists(t) Then .Item(t) = 0& Else cnt = cnt + 1 End If Next End With
Debug.Print cnt & " dictionary: " & Timer - tm End Sub
Sub million_dictionary2() Dim tm!: tm = Timer Dim a(), x, cnt&, t$ a = [a1:a1000000].Value With CreateObject("Scripting.Dictionary") .CompareMode = 1 For Each x In a t = x .Item(t) = 0& Next cnt = 1000000 - .Count End With
Debug.Print cnt & " dictionary2: " & Timer - tm End Sub
[/vba] Если в словарь заносить не строку, а число - то что-то я результата не дождался...
Провёл свой тест (не поверил, что мои любимые словари могут так подкачать ):
[vba]
Code
Sub test_Arr() Dim Arr(1 To 1000000), l&, tm! For l = 1 To 1000000: Arr(l) = l: Next l tm = Timer With New Collection For l = 1 To 1000000 .Add Key:=CStr(Arr(l)), Item:=Arr(l) Next l End With Debug.Print "Collection_Add", Timer - tm tm = Timer With CreateObject("Scripting.Dictionary") For l = 1 To 1000000 .Add Key:=CStr(Arr(l)), Item:=Arr(l) Next l End With Debug.Print "Dictionary_Add", Timer - tm tm = Timer With CreateObject("Scripting.Dictionary") For l = 1 To 1000000 .Item(CStr(Arr(l))) = Arr(l) Next l End With Debug.Print "Dictionary_Item", Timer - tm End Sub
А потом прикинул, что из коллекции нужно будет ещё циклом по одному куда-то выводить и немного успокоился
Провёл свой тест (не поверил, что мои любимые словари могут так подкачать ):
[vba]
Code
Sub test_Arr() Dim Arr(1 To 1000000), l&, tm! For l = 1 To 1000000: Arr(l) = l: Next l tm = Timer With New Collection For l = 1 To 1000000 .Add Key:=CStr(Arr(l)), Item:=Arr(l) Next l End With Debug.Print "Collection_Add", Timer - tm tm = Timer With CreateObject("Scripting.Dictionary") For l = 1 To 1000000 .Add Key:=CStr(Arr(l)), Item:=Arr(l) Next l End With Debug.Print "Dictionary_Add", Timer - tm tm = Timer With CreateObject("Scripting.Dictionary") For l = 1 To 1000000 .Item(CStr(Arr(l))) = Arr(l) Next l End With Debug.Print "Dictionary_Item", Timer - tm End Sub
Файл в формате xlsb распух почти до 10 мб - куда прикладывать? Нагенери кодом свой миллион чего-нибудь Я правда вручную тянул за несколько заходов - поэтому 640912 повторов
Файл в формате xlsb распух почти до 10 мб - куда прикладывать? Нагенери кодом свой миллион чего-нибудь Я правда вручную тянул за несколько заходов - поэтому 640912 повторов Hugo
Алексей, а если выводить не нужно? Если работа делается при занесении в коллекцию? Просто была одна задача по сортировке миллиона на две части по хитрому закону - я на словаре уложился в 67 секунд, а Ted the Mechanic на коллекции в 11!
Алексей, а если выводить не нужно? Если работа делается при занесении в коллекцию? Просто была одна задача по сортировке миллиона на две части по хитрому закону - я на словаре уложился в 67 секунд, а Ted the Mechanic на коллекции в 11!Hugo