Коллекции

Агент может содержать переменные. Переменные обычно используются для моделирования изменяющихся характеристик агента или для хранения результатов работы модели. AnyLogic поддерживает два типа переменных: простые переменные и коллекции.

Переменная представляет собой переменную любого скалярного типа или Java класса. 

Коллекция представляет собой группу объектов, известных как ее элементы. Некоторые коллекции позволяют хранение нескольких одинаковых элементов, некоторые - нет. Некоторые коллекции упорядочены, некоторые - нет. Коллекция используется для задания объекта данных, объединяющего в себе сразу несколько однотипных элементов. С помощью коллекций вы можете хранить, извлекать и управлять агрегированными данными. Обычно коллекции представляют элементы данных, которые образуют группу, например, очередь (в этом случае элементы представляют собой людей, ожидающих в очереди) или автопарк (элементы задают автомобили), или телефонный справочник (коллекция хранит соответствие имен и телефонных номеров).

Как и все другие переменные AnyLogic, коллекции доступны из кода во время работы модели, вы можете работать с элементами коллекции посредством ее программного интерфейса.

Создание коллекции

 Чтобы создать коллекцию

  1. Перетащите элемент  Коллекция из палитры  Агент на диаграмму типа агентов (или эксперимента).
  2. Перейдите в панель Свойства.
  3. Введите имя коллекции в поле Имя. Это имя будет использоваться для идентификации и доступа к переменной.
  4. Задайте класс коллекции. Выберите один из наиболее часто используемых классов из выпадающего списка Класс коллекции или самостоятельно введите имя Java класса, представляющего собой другую реализацию коллекции. 
  5. Если коллекция является списком или набором (Класс коллекции ArrayListLinkedList, HashSet, LinkedHashSet или TreeSet), задайте тип элементов коллекции. Выберите один из наиболее часто используемых типов из выпадающего списка Тип элементов или самостоятельно введите имя любого другого Java класса. Тем самым вы позволите коллекции содержать элементы только заданного класса (и его подклассов). Выбрав Object, вы позволяете коллекции содержать элементы произвольного Java класса.
  6. Коллекция может содержать набор элементов при инициализации. Этот набор задается в секции свойств коллекции Начальное содержимое. Чтобы добавить элементы, нажмите кнопку  и выберите требуемые элементы из выпадающего списка, либо нажмите кнопку  и выберите элементы в графическом редакторе, щелкнув по ним мышью. Выбрать можно только элементы типа, указанного в поле Тип элементов.

    Если элементы в секции свойств Начальное содержимое не выбраны, коллекция будет проинициализирована пустой. В дальнейшем вы можете управлять её содержимым программно с помощью программного интерфейса коллекций.

  7. Если же Класс коллекции - TreeMap или LinkedHashMap, то вам будет нужно задать тип элементов-ключей, поддерживаемых этой коллекцией, в поле Тип элементов-ключей, а тип элементов-значений - в поле Тип элементов-значений.
Основные свойства

Имя – Имя коллекции. 

Отображать имя – Если опция выбрана, то имя коллекции будет отображаться в графическом редакторе.

Исключить – Если опция выбрана, то коллекция будет исключена из модели.

Видимость – Если опция выбрана, то коллекция будет отображаться на презентации во время выполнения модели.

Класс коллекцииКласс коллекции. Выберите один из наиболее часто используемых классов из выпадающего списка или самостоятельно введите имя Java класса, представляющего собой другую реализацию коллекции.

Тип элементов – [Виден, если Класс коллекции ArrayListLinkedList, HashSet, LinkedHashSet или TreeSet] Тип элементов коллекции. Выберите один из наиболее часто используемых типов из выпадающего списка или самостоятельно введите имя любого другого Java класса. Тем самым вы позволите коллекции содержать элементы только заданного класса (и его подклассов). Выбрав Object, вы позволяете коллекции содержать элементы абсолютно любого Java класса.

Тип элементов-ключей – [Виден, если Класс коллекции TreeMap или LinkedHashMap] Тип элементов-ключей, поддерживаемых этой коллекцией.

Тип элементов-значений – [Виден, если Класс коллекции TreeMap или LinkedHashMap] Тип элементов-значений, соответствующих ключам коллекции.

Начальное содержимое – [Виден, если Класс коллекции ArrayListLinkedList, HashSet, LinkedHashSet или TreeSet] Здесь вы можете задать начальное содержимое коллекции, выбрав элементы либо из выпадающего списка, либо щелкнув по ним мышью в графическом редакторе. Выбрать можно только элементы того типа, который указан в поле Тип элементов.

Специфические

Уровень доступа – Уровень доступа к коллекции. Есть четыре уровня доступа:
    private – 
коллекция доступна только из этого типа агентов
    protected
коллекция доступна из этого типа агентов и его подклассов
    default
коллекция доступна из любого места модели
    public
коллекция доступна из всех открытых моделей.

Сохранять при сохранении состояния модели – Если опция выбрана, то коллекция будет сохраняться при сохранении состояния модели.

Статическая – Если опция выбрана, то коллекция будет статической, т.е. будет иметь одно и то же значение во всех имеющихся в модели экземплярах данного класса (например, во всех агентах популяции). Не используйте статические коллекции, если вы планируете проводить сложный эксперимент (оптимизационный экспериментэксперимент варьирования параметров и т.д.), предусматривающий параллельное выполнение нескольких итераций на разных ядрах процессора (возможность параллельного выполнения итераций задается с помощью опции Разрешить параллельное выполнение итераций в настройках эксперимента).

Типы коллекций

Существует несколько различных реализаций коллекций. Они отличаются способами хранения элементов данных и механизмами доступа к ним. В приведенной ниже таблице приводятся характеристики времени, требуемого на выполнение основных операций в различных реализациях коллекций (а именно, тип зависимости затрачиваемого на выполнение операции времени от размера коллекции):

Операция ArrayList LinkedList LinkedHashSet TreeSet TreeMap LinkedHashMap
Получение размера Постоянная Постоянная Постоянная
Постоянная Постоянная Постоянная
Добавление элемента Постоянная Постоянная Постоянная Логарифмическая Логарифмическая Постоянная
Удаление заданного элемента Линейная Линейная Постоянная
Логарифмическая Логарифмическая Постоянная
Удаление по индексу Линейная Линейная - - - -
Получение элемента по индексу Постоянная Линейная - - - -
Проверка, содержит ли коллекция элемент Линейная Линейная Постоянная Логарифмическая Логарифмическая Постоянная

Следующие коллекции являются наиболее часто используемыми и могут быть выбраны из списка Класс коллекции:

Реализация интерфейса List в виде массива переменного размера. Реализует все опциональные операции списка; разрешает добавление любых элементов, в том числе null. (Этот класс, грубо говоря, эквивалентен классу Vector, за исключением того, что он не синхронизирован).

Реализация интерфейса List в виде связного списка. Реализует все опциональные операции списка; разрешает добавление любых элементов, в том числе null. В дополнение к методам интерфейса List, класс LinkedList предоставляет однотипно названные методы для получения, удаления и вставки элемента в начало и конец списка. Эти методы позволяют использовать связные списки в качестве очередей, стеков и очередей с двусторонним доступом.

Класс реализует интерфейс Deque, предоставляющий операции добавления, извлечения и т.д., работающие по принципу FIFO (первым прибыл, первым обслужен).

Реализация интерфейса Set в виде связного и списка и хэш-таблицы. Порядок итерирования по LinkedHashSet соответствует порядку добавления в него элементов. При этом общий порядок добавления элементов не меняется при повторном добавлении элемента. Класс реализует все опциональные операции списка и разрешает добавление любых элементов, в том числе null.

Данный тип коллекции не синхронизирован, поэтому при работе в многопоточной среде нуждается во внешней синхронизации.

Реализация интерфейса NavigableSet в виде объекта TreeMap. При создании коллекции можно выбрать как естественный порядок сортировки элементов, так и задать его с помощью объекта Comparator.

Данный тип коллекции не синхронизирован, поэтому при работе в многопоточной среде нуждается во внешней синхронизации.

Реализация интерфейса NavigableMap, основанная на красно-черных деревьях. При создании коллекции можно выбрать как естественный порядок сортировки элементов, так и задать его с помощью объекта Comparator.

Данный тип коллекции не синхронизирован, поэтому при работе в многопоточной среде нуждается во внешней синхронизации.

Упорядоченная реализация интерфейса Map в виде связного и списка и хэш-таблицы. Порядок итерирования по  LinkedHashMap может соответствовать как порядку добавления в него элементов, так и порядку последнего обращения к ним (элемент, к которому произошло обращение, перемещается в конец списка).

Данный тип коллекции не синхронизирован, поэтому при работе в многопоточной среде нуждается во внешней синхронизации.

Полную документацию (обзор, учебные пособия, справочник классов) по коллекциям Java (на английском языке) вы можете найти по адресу http://docs.oracle.com/javase/8/docs/technotes/guides/collections/index.html.