Collections: AssocArray

Материал из Вики ИТ мехмата ЮФУ
(перенаправлено с «Unit Collections: AssocArray»)
Перейти к: навигация, поиск

Интерфейс

type AssocArray<DataType> = class
  /// Позволяет обращаться к элементам массива по ключу
  /// (Например, zoo['крокодил'])
  property Elem[key: KeyType]: ValueType;
 
  
  ///Выводит содержимое ассоциативного массива на консоль
  procedure Println();
end;

Реализация

interface

type
  /// Шаблон класса AssocArray [Ассоциативный массив]
  AssocArray<KeyType, ValueType> = class
  private
    /// Ключи
    keys: DynArray<KeyType> := new DynArray<KeyType>;
    /// Значения, соответствующие ключам
    values: DynArray<ValueType> := new DynArray<ValueType>;
 
    /// Устанавливает значение элемента с ключом key равным value
    procedure SetElem(key: KeyType; value: ValueType);
    /// Возвращает значение элемента с ключом key
    function GetElem(key: KeyType): ValueType;
 
  public
    // --------------------------------- Свойства --------------------------------
    /// Позволяет обращаться к элементам массива по ключу
    /// (Например, zoo['крокодил'])
    property Elem[key: KeyType]: ValueType read GetElem write SetElem; default;
 
    // ---------------------------------- Вывод ----------------------------------
    ///Выводит содержимое ассоциативного массива на консоль
    procedure Println();
  end;

implementation

// ---------------------------- Доступ к элементам ---------------------------
{Устанавливает значение элемента с ключом key равным value}
procedure AssocArray<KeyType, ValueType>.SetElem(key: KeyType; value: ValueType);
begin
  var ind := Keys.Find(key);
  if ind <> -1 then
    Values[ind] := value
  else
  begin
    Keys.Add(key);
    Values.Add(value);
  end;
end;
 
{Возвращает значение элемента с ключом key}
function AssocArray<KeyType, ValueType>.GetElem(key: KeyType): ValueType;
begin
  var ind := Keys.Find(key);
  if ind <> -1 then
    result := Values[ind]
  else
  begin
    Keys.Add(key);
    Values.Add(default(ValueType));
    result := default(ValueType);
  end;
end;
 
// ---------------------------------- Вывод ----------------------------------
{Выводит содержимое ассоциативного массива на консоль}
procedure AssocArray<KeyType, ValueType>.Println();
begin
  for var i := 0 to keys.Count - 1 do
    writeln(keys[i], ': ', values[i]);
end;

Примеры использования

uses Collections;

begin
  // Создание нового объекта ассоциативного массива
  var zoo := new AssocArray<string, integer>;
  
  // Создание нового элемента
  zoo['Жираф'] := 5;
  zoo['Слон'] := 1;
  
  // Чтение несуществующего элемента 
  // (автоматически добавляется в массив с нулевым значением)
  writeln('Какаду: ', zoo['Какаду']); 
  writeln();
  
  // Вывод сдержимого всего ассоциативного массива
  writeln('Содержимое ассоциативного массива:');
  zoo.Println;
  writeln();
  
  // Изменение значение элемента
  zoo['Какаду'] := zoo['Какаду'] + 3;
  
  writeln('Содержимое ассоциативного массива:');
  zoo.Println;
  writeln();
end.

См. также

Collections (полный текст модуля):