Здравствуйте! Пытался разобраться с использованием "Dictionary", но сразу наступил на грабли. Для сравнения их работы использовал два макроса выполняющие одно и то же - один с использованием массива, второй с использованием "Dictionary". И при том, что "Dictionary" позиционируется как наиболее быстрый - в данном случае массив его обгоняет в десятки раз! Прошу Вас, посмотрите, может быть я для себя неверный пример сделал, может этот пример совсем некорректный для сравнения возможностей "Dictionary" и массива, может быть использование "Dictionary" оправдывает себя не во всех случаях, может быть именно в этом случае лучше использовать массив!? В каких вообще случаях использование "Dictionary" оправдывает себя? В общем много вопросов. В приложенном файле чуть более 5000 строк с данными (иначе не проходит по размеру файла), при этом количестве строк "Dictionary" и массив работают одинаково быстро, но если увеличить количество строк хотя бы до 50 - 100 тысяч разница в их работе становится существенной (массив быстрее).
Здравствуйте! Пытался разобраться с использованием "Dictionary", но сразу наступил на грабли. Для сравнения их работы использовал два макроса выполняющие одно и то же - один с использованием массива, второй с использованием "Dictionary". И при том, что "Dictionary" позиционируется как наиболее быстрый - в данном случае массив его обгоняет в десятки раз! Прошу Вас, посмотрите, может быть я для себя неверный пример сделал, может этот пример совсем некорректный для сравнения возможностей "Dictionary" и массива, может быть использование "Dictionary" оправдывает себя не во всех случаях, может быть именно в этом случае лучше использовать массив!? В каких вообще случаях использование "Dictionary" оправдывает себя? В общем много вопросов. В приложенном файле чуть более 5000 строк с данными (иначе не проходит по размеру файла), при этом количестве строк "Dictionary" и массив работают одинаково быстро, но если увеличить количество строк хотя бы до 50 - 100 тысяч разница в их работе становится существенной (массив быстрее).Oleg_Nik
1. Переменные ОЧЕНЬ не рекомендуется называть row, item, key и т.п. Эти слова зарезервированы в VBA 2. Словарь нужен тогда, когда Вы или делаете список уникальных, или в каком-то списке потом что-то искать будете. Есть еще несколько вариантов применения, но сейчас не про это. Вы же в своем коде просто делаете перебор. Зачем для этого словарь? 3. И зачем для этого массив? Все можно написать вообще в одну строку [vba]
* Добавлено Кстати, если Вы берете массив прямо с листа, то не нужно предварительно обозначать его размеры. Это я про то, что строка [vba]
Код
ReDim mass(lLastRow, 2)
[/vba]не нужна
** Добавлено А в словарь (не в этом примере, а вообще) лучшге добавлять данные из массива. Сначала кладеем данные с листа в массив, потом оттуда циклом в словарь (это, конечно, если данные не из рваных диапазонов, там уже сморетть нужно). К данным на листе нужно обращаться как можно реже. Именно из-за этого у Вас второй макрос и тормозит
1. Переменные ОЧЕНЬ не рекомендуется называть row, item, key и т.п. Эти слова зарезервированы в VBA 2. Словарь нужен тогда, когда Вы или делаете список уникальных, или в каком-то списке потом что-то искать будете. Есть еще несколько вариантов применения, но сейчас не про это. Вы же в своем коде просто делаете перебор. Зачем для этого словарь? 3. И зачем для этого массив? Все можно написать вообще в одну строку [vba]
* Добавлено Кстати, если Вы берете массив прямо с листа, то не нужно предварительно обозначать его размеры. Это я про то, что строка [vba]
Код
ReDim mass(lLastRow, 2)
[/vba]не нужна
** Добавлено А в словарь (не в этом примере, а вообще) лучшге добавлять данные из массива. Сначала кладеем данные с листа в массив, потом оттуда циклом в словарь (это, конечно, если данные не из рваных диапазонов, там уже сморетть нужно). К данным на листе нужно обращаться как можно реже. Именно из-за этого у Вас второй макрос и тормозит_Boroda_
Для сравнения - правильная работа со словарем, и не правильная - с массивом. [vba]
Код
Sub mass() Dim mass As Variant Dim i As Variant Dim lLastRow As Long Dim t!: t = Timer lLastRow = Cells(Rows.Count, 2).End(xlUp).row ReDim mass(lLastRow, 2) For i = 1 To lLastRow mass(i - 1, 1) = Cells(i, 2).Value Next MsgBox Format(Timer - t, "0.00000") End Sub Sub dic() Dim odic As Object, arr, lLastRow&, i& Dim t!: t = Timer Set odic = CreateObject("Scripting.Dictionary") lLastRow = Cells(Rows.Count, 2).End(xlUp).row arr = Range(Cells(1, 2), Cells(lLastRow, 3)) For i = 1 To UBound(arr) odic.Item(i) = arr(i, 1) Next MsgBox Format(Timer - t, "0.00000") End Sub
[/vba]
Для сравнения - правильная работа со словарем, и не правильная - с массивом. [vba]
Код
Sub mass() Dim mass As Variant Dim i As Variant Dim lLastRow As Long Dim t!: t = Timer lLastRow = Cells(Rows.Count, 2).End(xlUp).row ReDim mass(lLastRow, 2) For i = 1 To lLastRow mass(i - 1, 1) = Cells(i, 2).Value Next MsgBox Format(Timer - t, "0.00000") End Sub Sub dic() Dim odic As Object, arr, lLastRow&, i& Dim t!: t = Timer Set odic = CreateObject("Scripting.Dictionary") lLastRow = Cells(Rows.Count, 2).End(xlUp).row arr = Range(Cells(1, 2), Cells(lLastRow, 3)) For i = 1 To UBound(arr) odic.Item(i) = arr(i, 1) Next MsgBox Format(Timer - t, "0.00000") End Sub
_Boroda_, спасибо! 1. Переменные оставил такими же как в примере файла который взял из Интернет. (были мысли о том, что при использовании "Dictionary" так и нужно). 2. Я Вас правильно понял, что применение словаря в данном случае некорректно - потому и нет никаких преимуществ в сравнении с массивом?
И ещё: "Словарь нужен тогда, когда Вы или делаете список уникальных, или в каком-то списке потом что-то искать будете" - это основное использование словаря?
_Boroda_, спасибо! 1. Переменные оставил такими же как в примере файла который взял из Интернет. (были мысли о том, что при использовании "Dictionary" так и нужно). 2. Я Вас правильно понял, что применение словаря в данном случае некорректно - потому и нет никаких преимуществ в сравнении с массивом?
И ещё: "Словарь нужен тогда, когда Вы или делаете список уникальных, или в каком-то списке потом что-то искать будете" - это основное использование словаря?Oleg_Nik
1. Словарь содержит только уникальные ключи, но к каждому ключу можно "прикрепить" практические любую информацию. 2. Взять эту информацию по ключу можно без поиска/перебора. Вот и используйте эти свойства, когда они подходят для задачи. Я например вчера словарь использовал для такой задачи (первый раз) - есть например два списка уникальных значений, частично пересекающиеся, нужно их расположить в двух столбцах, чтоб совпадающие были в одной строке, остальные не важно как (но в одной только совпадающие!). Делается легко и без всякой сортировки, просто берём значение из одной группы, заносим в словарь с порядковым номером (новому номер берём от количества ключей словаря +1), пишем значение в столбец в строку с таким номером. Затем берём значения второй группы и аналогично записываем в словарь если его там ещё нет, значение пишем в строку с номером, полученным из словаря. Т.е. если новое - будет ниже, если уже было - будет в одной строке с предыдущим.
1. Словарь содержит только уникальные ключи, но к каждому ключу можно "прикрепить" практические любую информацию. 2. Взять эту информацию по ключу можно без поиска/перебора. Вот и используйте эти свойства, когда они подходят для задачи. Я например вчера словарь использовал для такой задачи (первый раз) - есть например два списка уникальных значений, частично пересекающиеся, нужно их расположить в двух столбцах, чтоб совпадающие были в одной строке, остальные не важно как (но в одной только совпадающие!). Делается легко и без всякой сортировки, просто берём значение из одной группы, заносим в словарь с порядковым номером (новому номер берём от количества ключей словаря +1), пишем значение в столбец в строку с таким номером. Затем берём значения второй группы и аналогично записываем в словарь если его там ещё нет, значение пишем в строку с номером, полученным из словаря. Т.е. если новое - будет ниже, если уже было - будет в одной строке с предыдущим.Hugo
[offtop]Вот именно так - первый И придумал этот алгоритм тоже именно для этой задачи. Сначала думал грузить всё в коллекцию, из неё в массив, сортировать... Чушь...[/offtop]
[offtop]Вот именно так - первый И придумал этот алгоритм тоже именно для этой задачи. Сначала думал грузить всё в коллекцию, из неё в массив, сортировать... Чушь...[/offtop]Hugo