Имя пользователя:
Пароль:
 

Показать сообщение отдельно

Ветеран


Сообщения: 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.

Отправлено: 02:22, 13-10-2017 | #8