Ассоциативные массивы в языке D

Автор: admin от 9-01-2016, 01:59, посмотрело: 461

Это перевод статьи «Associative arrays», опубликованной 1 января 2016 года. На мой вкус статья несколько излишне поверхностна и не содержит большого количества подробностей, но она может быть полезной тем, кто знаком с ассоциативными массивами в других языках программирования.

В языке D есть встроенная поддержка ассоциативных массивов, также известных как хэш-таблицы.
Они аналогичны Map в Java или std::unordered_map в C++.

Объявление ассоциативного массива



Чтобы объявить ассоциативный массив, используйте следующий синтаксис:

// Прим. перев.: value — тип значения, key — тип ключа
value[key] myAssociativeArray;



Вставка элементов в ассоциативный массив


Для вставки элементов в ассоциативный массив используйте оператор [].
Ниже приведён пример создания ассоциативного массива квадратов целых чисел от 0 до 10 и вывода их на экран.

import std.stdio;

void main()
{
    int[int] squares; // Объявление

    for (int i = 0; i <= 10; ++i)
        squares[i] = i * i; // Вставка в ассоциативный массив

    writeln(squares);
}


Запустив пример, мы получим следующий вывод:
[0:0, 6:36, 7:49, 2:4, 3:9, 10:100, 1:1, 8:64, 5:25, 4:16, 9:81]
Обратите внимание, что числа не отсортированы — это ожидаемо: ассоциативные массивы внутренне не сортируются.
Примечания:

  • Переназначение существующего ключа заменит значение.

  • Попытка обратиться к несуществующему ключу приведёт к ошибке core.exception.RangeError.



Удаление элементов из ассоциативного массива


Для удаления элементов из ассоциативного массива используйте функцию remove().

aa.remove("hello");


Проверка на существование ключа


Для проверки ключа на существование используйте оператор in, который возвращает указатель на значение. Если ключ не существует, указатель будет null.

int[int] squares;

// ...

int* p = 10 in squares;
// Прим. перев.: Не проверяйте на null операторами сравнения, используйте is
if (p !is null)
    writeln(*p);
else
    writeln("Нет значения.");


Очистка ассоциативного массива


Существует два способа очистить ассоциативный массив:

  1. Пройтись по ключам и удалить их

  2. Отбросить старый массив и создать новый



Способ 1: удаляем ключи


foreach (key; aa.keys)
    aa.remove(key);


Способ 2: создаём новый массив


Чтобы выбросить существующий массив, присвойте ему значение null.

aa = null; // помечено для сборки мусора
aa[1] = 1; // записано по новому адресу в памяти


Свойства


Мы уже знакомы с некоторыми свойствами ассоциативных массивов, например, remove() или keys. Ниже приведены остальные:













































СвойствоОписание
.sizeofВозвращает размер ссылки на ассоциативный массив. В 32-битных сборках это 4, а в 64-битных сборках 8.
.lengthВозвращает количество значений в массиве. В отличие от динамических массивов, это свойство только для чтения.
.dupСоздаёт ассоциативный массив того же размера и копирует в него содержимое первого массива.
.keysВозвращает динамический массив, элементы которого являются ключами исходного ассоциативного массива.
.valuesВозвращает динамический массив, элементы которого являются значениями исходного ассоциативного массива.
.rehashНа месте реорганизует массив, оптимизируя поиск по нему. rehash полезен, например, когда в программу подгружается таблица символов, по которой впоследствии нужно производить поиск. Возвращает ссылку на реорганизованный массив.
.byKey()Возвращает диапазон, подходящий для перебора с помощью цикла foreach ключей ассоциативного массива.
.byValue()Возвращает диапазон, подходящий для перебора с помощью цикла foreach значений ассоциативного массива.
.byKeyValue()Возвращает диапазон, подходящий для перебора с помощью цикла foreach пар ключ-значение ассоциативного массива. Возвращаемые пары представляются в виде непрозрачного типа со свойствами .key и .value, позволяющими обращаться соответственно к ключу и значению пары.
.get(Key key, lazy Value defVal)Ищет ключ key. Если он существует, возвращает соответствующее ему значение; если не существует, отрабатывает и возвращает значение по умолчанию defVal.


Что ещё почитать


Для более подробной информации (например, чтобы узнать о работе с классами и структурами в ассоциативных массивах) обратитесь к официальной документации на dlang.org.

Источник: Хабрахабр

Категория: Программирование » Веб-разработка

Уважаемый посетитель, Вы зашли на сайт как незарегистрированный пользователь.
Мы рекомендуем Вам зарегистрироваться либо войти на сайт под своим именем.

Добавление комментария

Имя:*
E-Mail:
Комментарий:
Полужирный Наклонный текст Подчеркнутый текст Зачеркнутый текст | Выравнивание по левому краю По центру Выравнивание по правому краю | Вставка смайликов Выбор цвета | Скрытый текст Вставка цитаты Преобразовать выбранный текст из транслитерации в кириллицу Вставка спойлера
Введите два слова, показанных на изображении: *