AnyLogic
Развернуть
Размер шрифта

Коллекции

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

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

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

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

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

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

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

Свойства

Основные свойства

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

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

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

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

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

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

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

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

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

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

Уровень доступа — Уровень доступа к коллекции. Есть четыре уровня доступа:

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

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

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

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

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

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

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

  • ArrayList
    Реализация интерфейса List в виде массива переменного размера. Реализует все опциональные операции списка; разрешает добавление любых элементов, в том числе null. (Этот класс, грубо говоря, эквивалентен классу Vector, за исключением того, что он не синхронизирован).
  • LinkedList
    Реализация интерфейса List в виде связного списка. Реализует все опциональные операции списка; разрешает добавление любых элементов, в том числе null. В дополнение к методам интерфейса List, класс LinkedList предоставляет однотипно названные методы для получения, удаления и вставки элемента в начало и конец списка. Эти методы позволяют использовать связные списки в качестве очередей, стеков и очередей с двусторонним доступом.
    Класс реализует интерфейс Deque, предоставляющий операции добавления, извлечения и т.д., работающие по принципу FIFO (первым прибыл, первым обслужен).
  • LinkedHashSet
    Реализация интерфейса Set в виде связного и списка и хэш-таблицы. Порядок итерирования по LinkedHashSet соответствует порядку добавления в него элементов. При этом общий порядок добавления элементов не меняется при повторном добавлении элемента. Класс реализует все опциональные операции списка и разрешает добавление любых элементов, в том числе null. Данный тип коллекции не синхронизирован, поэтому при работе в многопоточной среде нуждается во внешней синхронизации.
  • TreeSet
    Реализация интерфейса NavigableSet в виде объекта TreeMap. При создании коллекции можно выбрать как естественный порядок сортировки элементов, так и задать его с помощью объекта Comparator. Данный тип коллекции не синхронизирован, поэтому при работе в многопоточной среде нуждается во внешней синхронизации.
  • TreeMap
    Реализация интерфейса NavigableMap, основанная на красно-черных деревьях. При создании коллекции можно выбрать как естественный порядок сортировки элементов, так и задать его с помощью объекта Comparator. Данный тип коллекции не синхронизирован, поэтому при работе в многопоточной среде нуждается во внешней синхронизации.
  • LinkedHashMap
    Упорядоченная реализация интерфейса Map в виде связного и списка и хэш-таблицы. Порядок итерирования по LinkedHashMap может соответствовать как порядку добавления в него элементов, так и порядку последнего обращения к ним (элемент, к которому произошло обращение, перемещается в конец списка). Данный тип коллекции не синхронизирован, поэтому при работе в многопоточной среде нуждается во внешней синхронизации.
Полную документацию (обзор, учебные пособия, справочник классов) по коллекциям Java (на английском языке) вы можете найти по адресу: https://docs.oracle.com/en/java/javase/11/docs/api/java.base/java/util/Collections.html.
Как мы можем улучшить эту статью?