Ассоциативный массив

Материал из Википедии — свободной энциклопедии

Перейти к: навигация, поиск

Ассоциативный массив (словарь, хеш-таблица) — структура данных. Массив, идентификаторами элементов которого являются не только целые числа, но и данные других типов (обычно строки). Идентификаторы обычно называются ключами. В отличие от индексного массива отсутствует строгая упорядоченность элементов. Обычные массивы могут рассматриваться как частный случай словаря, где ключ — это целое число

Поддержка ассоциативных массивов есть во многих интерпретируемых языках программирования высокого уровня (Perl, PHP, Python, Ruby и др.). В языке C++ поддержка ассоциативных массивов включена в стандартную библиотеку (контейнер map).

Содержание

[править] Достоинства

  • Наглядность, удобство для человека, возможность присвоить каждому элементу осмысленный идентификатор
  • Лёгкость добавления или удаления элементов, так как в общем случае не требуется изменения позиций других
  • Ассоциативный массив обобщает собой сразу несколько типов данных (записи или структуры, обычные массивы, простейшие объекты)

[править] Недостатки

  • дополнительный расход памяти на идентификаторы (даже если они хранятся в виде хеша)
  • сложность поиска элемента по ключу
  • сложность создания оптимизированных компиляторов для языка, в котором существует понятие ассоциативного массива
  • любые операции с ассоциативным массивом по определению будут проводится медленнее, чем с обычным массивом, особенно если последний реализуется в стиле C++ (напрямую через механизм указателей)

[править] Примеры

[править] Python

Встроенный в Питон тип ассоциативного массива называется словарём, элементами которого являются пары ключей и соответствующих им значений.

d1 = dict(a=10, b=20)
d2 = {'a': 10, 'b': 20}
d1[100] = 123
d2['c'] = 321
d1[100] = 1023

Здесь были показаны два способа написания литерала словаря и продемонстрировано, что ключом может быть объект любого типа. Добавление нового объекта в словарь не требует предварительных проверок: если ранее ключу уже соответствовало некоторое значение, оно будет перезаписано (Подробнее см. Python Tutorial, Dictionaries(англ.)). Другие операции со словарем:

if 'a' in d1:    # проверка наличия ключа
    del d1['a']        # удаление ключа (и значения)
val = d1.get('a', 'default value')   # получение значения по ключу или значения 
                                     # по умолчанию в случае отсутствия ключа
val = d1.setdefault('a', 'default value')   # получение значения по ключу или значения 
                       # по умолчанию в случае отсутствия ключа (при этом
                       # значение записывается в словарь)
d1.keys()              # список ключей
d1.values()            # список значений
d1.items()             # список пар ключ-значение

На Python весьма просто можно написать свой класс, который будет вести себя подобно словарю. Для этого необходимо лишь определить в своем классе соответствующие методы (см. Python Reference Manual, Emulating container types(англ.)).

Расширить свойства встроенного типа словаря (dict) можно путем наследования класса, см. пример.

[править] Perl

На Perl Ассоциативный массив на самом деле является массивом (списком), в котором элементы с четным индексом являются ключами, а нечетным - значениями

%hash = (
            'cat' => 'kitten',
            'dog' => 'puppy',
            'cow' => 'calf'
        );
print $hash{'cat'}; #Напечатает kitten
print  keys  ; # Вывод всех ключей. Напечатает catdogcow 
print values ; # Вывод всех значений. Напечатает kittenpuppycalf
print %hash ; #Напечатает catkittencowcalfdogpuppy

[править] Delphi

Delphi не имеет прямых средств работы с ассоциативными массивами. Однако, вы можете имитировать ассоциативные массивы, используя объект TStrings. Например:

procedure TForm1.Button1Click(Sender: TObject);
var
  DataField: TStrings;
  i: Integer;
begin
  DataField := TStringList.Create;
 
  DataField.Add(Format('%s=%s', ['Sally Smart', '555-9999']));
  DataField.Add(Format('%s=%s', ['John Doe', '555-1212']));
  DataField.Add(Format('%s=%s', ['J. Random Hacker', '553-1337']));
 
  // доступ к значению и вывод его в message box
  ShowMessage(DataField.Values['Sally Smart']);
 
  // проход по ассоциативному массиву 
  for i := 0 to DataField.Count - 1 do
  begin
    ShowMessage('Number for ' + DataField.Names[i] + ': ' + DataField.ValueFromIndex[i]);
  end;
 
  DataField.Free;
end;

[править] С

В языке Си может использоватся подобие ассоциативного массива

enum notes {DO,RE, MI, FA, SOL, LA, SI}; //Объявляем ключи
unsigned short int sample[7];            //Создаем массив
 
//Обращаемся к элемента массива по именованным ключам
//Задаем частоту нотных семплов в герцах
sample[DO]=262;
sample[RE]=294; 
sample[MI]=330;
sample[FA]=349;
sample[SOL]=392;
sample[LA]=440;
sample[SI]=494;

Хэш может быть "связан" (tie) с внешним источником данных, например с файлом или же с таблицей базы данных.


На других языках