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 — коллекция доступна из всех открытых моделей

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

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

Примеры

В следующей модели посетители торгового центра посещают определенные магазины согласно своему плану. План задан находящейся в типе агента Consumer коллекцией tasks. Эта коллекция хранит элементы типа Task. Коллекция изначально пуста: список задач посетителя создается функцией generateTasks, которая вызывается в поле действия При выходе каждого блока PedSource этой модели. Различные задачи добавляются в коллекцию с помощью ее функции add().

Имеет смысл посмотреть и на другую коллекцию в этой модели: shopEntrances, заданную в типе агента Main. В моделируемом торговом центре 138 магазинов, заданных логически всего одним нестандартным реплицированным блоком shops. Входы в магазины заданы графически с помощью целевых линий. Коллекция shopEntrances хранит все эти целевые линии. В данном случае содержимое коллекции задано изначально - посмотрите на свойство коллекции Начальное содержимое и вы увидите, что она содержит 138 элементов разметки пространства типа TargetLine. Блок shops ссылается на эту коллекцию в своем нестандартном свойстве Area entrance: каждый экземпляр реплицированного блока использует ту целевую линию из коллекции, которая задает вход в соответствующий магазин. Это делается с помощью переменной index, хранящей порядковый номер соответствующего экземпляра реплицированного блока: shopEntrances.get(index).

Демо-модель: Shopping Mall Открыть страницу модели в AnyLogic Cloud. Там можно запустить модель или скачать ее по ссылке Исходные файлы модели.

В модели, изучающей сердечно-сосудистые заболевания, есть две коллекции в типе агента Patient: StrokeHistory и MIHistory. Они используются для записи сведений о происходящих у пациентов инфарктах и инсультах. Новые элементы добавляются в коллекции в коде действия события пациента annualEvent. Обычно коллекции хранят элементы - экземпляры типов агента или Java классов, но в данном случае они хранят значения типа int, представляющие собой простые временные метки.

Демо-модель: Cardiovascular Disease Открыть страницу модели в AnyLogic Cloud. Там можно запустить модель или скачать ее по ссылке Исходные файлы модели.

В модели корпоративного обучения можно изучить, как коллекции заполняются данными, считанными из базы данных. Две коллекции в типе агента Main, employeeTypes и trainerTypes, хранят списки возможных типов тренеров и сотрудников (данные заданы просто в виде строк текста, тип элементов коллекций - String). Если вы посмотрите на свойство коллекции Начальное содержимое, то увидите, что свойство переключено в режим Ссылка на базу данных, и простой запрос наполняет коллекцию данными, считанными из заданного столбца таблицы базы данных модели.

Демо-модель: Corporate Education Открыть страницу модели в AnyLogic Cloud. Там можно запустить модель или скачать ее по ссылке Исходные файлы модели.

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

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

Операция 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.
Как мы можем улучшить эту статью?