Ветеран
Сообщения: 27449
Благодарности: 8088
|
Профиль
|
Отправить PM
| Цитировать
Цитата blackeangel:
Если вы мне обьясните как это работает простым деревенским языком, то пойму и буду их использовать. »
|
Простым языком… Ну, давайте попробуем.
Простейший вариант реализован в WSH, в VB и в VBA. Пример демонстрации свойств и методов словаря на WSH, исполнять под консольным cscript.exe:
Скрытый текст
Код: 
Option Explicit
Dim objDictionary
Dim strKey, strValue
Dim arrKeys, arrValues
Dim i
Set objDictionary = WScript.CreateObject("Scripting.Dictionary")
' Сравнение ключей будем производить в текстовом виде
' (тогда будет игнорироваться различие строчных и заглавных букв)
objDictionary.CompareMode = vbTextCompare
' Заполняем словарь парами Ключ/Значение
objDictionary.Add "Ключ1", "Значение1"
objDictionary.Add "Ключ2", "Значение2"
objDictionary.Add "Ключ3", "Значение3"
objDictionary.Add "Ключ4", "Значение4"
objDictionary.Add "Ключ5", "Значение5"
objDictionary.Add "Ключ6", "Значение6"
' Добавим ещё три пары Ключ/Значение
objDictionary.Add "Ключ7", "Значение7"
objDictionary.Add "Ключ8", "Значение8"
objDictionary.Add "Ключ9", "Значение9"
' Заменим значение ключей Ключ3 и Ключ4
objDictionary.Item("Ключ3") = "Мама мыла раму"
objDictionary.Item("Ключ4") = "Рабы не мы, мы не рабы"
' Удалим две пары Ключ/Значение
objDictionary.Remove "Ключ4"
objDictionary.Remove "Ключ5"
' Попытка добавления уже существующего ключа или удаления несуществующего
' вызовет ошибку времени исполнения.
' Чтобы этого избежать, мы можем проверять существование ключа перед данными операциями
If Not objDictionary.Exists("Ключ10") Then
objDictionary.Add "Ключ10", "Значение10"
End If
If objDictionary.Exists("Ключ6") Then
objDictionary.Remove "Ключ6"
End If
' Тип значения словаря
WScript.Echo TypeName(objDictionary)
WScript.Echo
' Количество элементов словаря
WScript.Echo objDictionary.Count
WScript.Echo
' Выводим содержимое словаря в виде пары Ключ/Значение, перебирая ключи
For Each strKey In objDictionary.Keys
WScript.Echo strKey, objDictionary.Item(strKey)
Next
WScript.Echo
' К предыдущему: тип значения objDictionary.Keys — массив типа Variant
WScript.Echo TypeName(objDictionary.Keys)
WScript.Echo
' Поэтому можно задействовать не только цикл вида For Each, но и обычный For…To…Next,
' несмотря на то, что обратиться напрямую по индексу к паре Ключ/Значение нельзя
' (только через промежуточную переменную, иначе лексический анализатор WSH спотыкается)
arrKeys = objDictionary.Keys
For i = LBound(arrKeys) To UBound(arrKeys)
WScript.Echo i, arrKeys(i), objDictionary.Item(arrKeys(i))
Next
WScript.Echo
' Выводим только значения:
For Each strValue In objDictionary.Items
WScript.Echo strValue
Next
WScript.Echo
' И аналогично — через For…To…Next
arrValues = objDictionary.Items
For i = LBound(arrValues) To UBound(arrValues)
WScript.Echo i, arrValues(i)
Next
WScript.Echo
' Выводим пары Ключ/Значение словаря Ключ2 и Ключ10
WScript.Echo objDictionary.Item("Ключ2")
WScript.Echo objDictionary.Item("Ключ10")
WScript.Echo
' Хотя обычно с индексами в словарях не работают, но можно сделать и так
' Выводим третью и четвёртую пары словаря (памятуя, что нумерация массивов идёт с нуля)
WScript.Echo arrKeys(2), objDictionary.Item(arrKeys(2))
WScript.Echo arrKeys(3), objDictionary.Item(arrKeys(3))
WScript.Echo
' Удалим все пары Ключ/Значение
objDictionary.RemoveAll
Set objDictionary = Nothing
WScript.Quit 0
Пример практической реализации — подсчёт количества одинаковых символов в произвольном тексте (дабы не усложнять кодировками, чтением из файла — используем банальную строковую переменную):
Скрытый текст
Код: 
Option Explicit
Dim strText, strSymbol
Dim objDictionary
Dim strKey
Dim i
strText = _
"И я рад Вас видеть" & _
"На счёт словарей/коллекций/эрей листов." & _
"Если вы мне обьясните как это работает простым деревенским языком, то пойму и буду их использовать." & _
"Если массивы окружают нас в жизни, то словарь только толковый или орфографический." & _
"Массивы это тетрадь в клетку, таблица экселя, 9 стаканов на столе(3х3), графический ключ на телефоне(3х3) и т.д."
Set objDictionary = WScript.CreateObject("Scripting.Dictionary")
For i = 1 To Len(strText)
' Извлекаем из строки очередной символ
strSymbol = Mid(strText, i, 1)
' Если его ещё нет в словаре…
If Not objDictionary.Exists(strSymbol) Then
' …то добавляем его и задаём ему значение количества равным 1
objDictionary.Add strSymbol, 1
Else
' …иначе увеличиваем его значение количества на единицу
objDictionary.Item(strSymbol) = objDictionary.Item(strSymbol) + 1
End If
Next
WScript.Echo "Symbol", vbTab, "Count"
WScript.Echo "======", vbTab, "====="
For Each strKey In objDictionary.Keys
WScript.Echo strKey, vbTab, objDictionary.Item(strKey)
Next
objDictionary.RemoveAll
Set objDictionary = Nothing
WScript.Quit 0
В более серьёзных языках, особенно в .Net, добавлены классы, которые не только полностью покрывают такой тип данных как Словарь, но и заметным образом расширяют его возможности, например прямое обращение к паре по индексу (поскольку класс сделан перечислимым), проверка существования значения, сортировка пар и прочее. Что-то похожее есть и во Free Pascal.
|