Что такое коллекция в программировании
Перейти к содержимому

Что такое коллекция в программировании

  • автор:

Коллекции в Java

В этом уроке мы рассмотрим коллекции, которые являются одной из важных частей Java Core.

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

Коллекции были добавлены в версии J2SЕ 1.2.

Collection framework в языке Java состоит из 3-х частей:

  • интерфейсы,
  • классы,
  • алгоритмы.

Практически все коллекции и интерфейсы являются обобщенными. На этапе создания коллекции, вы скорее всего будете знать элементы какого типа вам нужны — String, Integer и т.д. Конечно же можно создать необобщенную коллекцию, но так делается крайне редко.

В этом уроке рассмотрим основные элементы коллекций, иерархия которых представлена на следующем рисунке:

Иерархия Collection Framework

Презентацию с видео можно скачать на Patreon .

  1. Интерфейс Collection
  2. Структуры данных
  3. Интерфейс List и класс ArrayList
  4. Интерфейс Set и классы HashSet, LinkedHashSet
  5. Интерфейс SortedSet и класс TreeSet
  6. Интерфейсы Comparable и Comparator
  7. Интерфейс NavigableSet
  8. Интерфейсы Queue и Deque
  9. Класс ArrayDeque
  10. Класс LinkedList
  11. Класс PriorityQueue
  12. Интерфейс Iterator
  13. Интерфейс ListIterator
  14. Отображения Map
  15. Класс Collections
  16. Backed Collections
  17. Legacy Classes
  18. Задания

Учебники. Программирование для начинающих.

Programm.ws — это сайт, на котором вы можете почитать литературу по языкам программирования , а так-же посмотреть примеры работающих программ на С++, ассемблере, паскале и много другого..

Программирование — в обычном понимании, это процесс создания компьютерных программ.
В узком смысле (так называемое кодирование) под программированием понимается написание инструкций — программ — на конкретном языке программирования (часто по уже имеющемуся алгоритму — плану, методу решения поставленной задачи). Соответственно, люди, которые этим занимаются, называются программистами (на профессиональном жаргоне — кодерами), а те, кто разрабатывает алгоритмы — алгоритмистами, специалистами предметной области, математиками.
В более широком смысле под программированием понимают весь спектр деятельности, связанный с созданием и поддержанием в рабочем состоянии программ — программного обеспечения ЭВМ. Более точен современный термин — «программная инженерия» (также иначе «инженерия ПО»). Сюда входят анализ и постановка задачи, проектирование программы, построение алгоритмов, разработка структур данных, написание текстов программ, отладка и тестирование программы (испытания программы), документирование, настройка (конфигурирование), доработка и сопровождение.

Delphi для профессионалов

Глава 7. Списки и коллекции

Коллекции

Коллекция представляет собой разновидность списка указателей, оптимизированную для работы с объектами определенного вида. Сама коллекция инкапсулирована в классе Tсо l lection. Элемент коллекции должен быть экземпляром класса, унаследованного от класса TCollectionitem . Это облегчает программирование и позволяет обращаться к свойствам и методам объектов напрямую.

Коллекции объектов широко используются в компонентах VCL. Например, панели компонента TCoolBar (см. гл. 5) объединены в коллекцию. Класс TCooiBands , объединяющий панели, является наследником класса TCollection . А отдельная панель — экземпляром класса TCoolBar , происходящего от класса TCollectionitem .

Поэтому знание свойств и методов классов коллекции позволит успешно использовать их при работе со многими компонентами (TDBGrid, TListview, TStatusBar, TCoolBar и т. д.).

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

Рис. 7.1. Редактор коллекции

Список Редактора объединяет элементы коллекции. При выборе одной строки из списка свойства объекта коллекции становятся доступны в Инспекторе объектов. В список можно добавлять новые элементы и удалять существующие, а также менять их взаимное положение.

Примеры использования коллекций представлены при описании соответствующих компонентов.

Коллекции

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

  • Доступ к элементам: каждая коллекция может быть перечислена для доступа к каждому элементу в порядке. Некоторые коллекции обращаются к элементам по индексу, позиция элемента в упорядоченной коллекции. Наиболее распространенным примером является System.Collections.Generic.List . Другие коллекции обращаются к элементам по ключу, где значение связано с одним ключом. Наиболее распространенным примером является System.Collections.Generic.Dictionary . Вы выбираете между этими типами коллекций в зависимости от способа доступа к элементам приложения.
  • Профиль производительности. Каждая коллекция имеет различные профили производительности для действий, таких как добавление элемента, поиск элемента или удаление элемента. Вы можете выбрать тип коллекции на основе операций, используемых большинством в приложении.
  • Динамическое увеличение и сжатие: большинство коллекций, поддерживающих добавление или удаление элементов динамически. В частности, Array, System.Span и System.Memory не.

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

Все типы коллекций можно найти в справочнике по API .NET. Дополнительные сведения см. в разделе «Часто используемые типы коллекций» и выбор класса коллекции.

В примерах этой статьи может потребоваться добавить директивы using для System.Collections.Generic пространств имен и System.Linq пространств имен.

Массивы представлены System.Array и поддерживают синтаксис на языке C#. Этот синтаксис предоставляет более краткие объявления для переменных массива.

System.Span ref struct — это тип, предоставляющий моментальный снимок по последовательности элементов без копирования этих элементов. Компилятор применяет правила безопасности, чтобы убедиться Span , что доступ к ней невозможно получить после того, как последовательность, на которую она ссылается, больше не находится в области. Он используется во многих API .NET для повышения производительности. Memory обеспечивает аналогичное поведение, если не удается использовать ref struct тип.

Начиная с C# 12, все типы коллекций можно инициализировать с помощью выражения Collection.

Индексируемые коллекции

Индексируемая коллекция — это коллекция , в которой можно получить доступ к каждому элементу с помощью его индекса. Его индекс — это количество элементов перед ним в последовательности. Таким образом, ссылка на элемент по индексу 0 является первым элементом, индексом 1 является второй и т. д. В этих примерах используется List класс. Это наиболее распространенная индексируемая коллекция.

В следующем примере создается и инициализируется список строк, удаляется элемент и добавляется элемент в конец списка. После каждого изменения он выполняет итерацию по строкам с помощью инструкции foreach или for цикла:

// Create a list of strings by using a // collection initializer. List salmons = ["chinook", "coho", "pink", "sockeye"]; // Iterate through the list. foreach (var salmon in salmons) < Console.Write(salmon + " "); >// Output: chinook coho pink sockeye // Remove an element from the list by specifying // the object. salmons.Remove("coho"); // Iterate using the index: for (var index = 0; index < salmons.Count; index++) < Console.Write(salmons[index] + " "); >// Output: chinook pink sockeye // Add the removed element salmons.Add("coho"); // Iterate through the list. foreach (var salmon in salmons) < Console.Write(salmon + " "); >// Output: chinook pink sockeye coho 

В следующем примере элементы из списка удаляются по индексу. Вместо инструкции foreach используется for оператор, который выполняет итерацию в порядке убывания. Метод RemoveAt приводит к тому, что элементы после удаленного элемента имеют более низкое значение индекса.

List numbers = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]; // Remove odd numbers. for (var index = numbers.Count - 1; index >= 0; index--) < if (numbers[index] % 2 == 1) < // Remove the element by specifying // the zero-based index in the list. numbers.RemoveAt(index); >> // Iterate through the list. // A lambda expression is placed in the ForEach method // of the List(T) object. numbers.ForEach( number => Console.Write(number + " ")); // Output: 0 2 4 6 8 
private static void IterateThroughList() < var theGalaxies = new List< new ()< Name="Tadpole", MegaLightYears=400>, new ()< Name="Pinwheel", MegaLightYears=25>, new ()< Name="Milky Way", MegaLightYears=0>, new () < Name="Andromeda", MegaLightYears=3>>; foreach (Galaxy theGalaxy in theGalaxies) < Console.WriteLine(theGalaxy.Name + " " + theGalaxy.MegaLightYears); >// Output: // Tadpole 400 // Pinwheel 25 // Milky Way 0 // Andromeda 3 > public class Galaxy < public string Name < get; set; >public int MegaLightYears < get; set; >> 

Коллекции пар «ключ-значение»

В приведенном ниже примере создается коллекция Dictionary и выполняется перебор словаря с помощью оператора foreach .

private static void IterateThruDictionary() < Dictionaryelements = BuildDictionary(); foreach (KeyValuePair kvp in elements) < Element theElement = kvp.Value; Console.WriteLine("key: " + kvp.Key); Console.WriteLine("values: " + theElement.Symbol + " " + theElement.Name + " " + theElement.AtomicNumber); >> public class Element < public required string Symbol < get; init; >public required string Name < get; init; >public required int AtomicNumber < get; init; >> private static Dictionary BuildDictionary() => new () < >, >, >, > >; 

В приведенном ниже примере используется метод ContainsKey и свойство Item[] Dictionary для быстрого поиска элемента по ключу. Свойство Item позволяет получить доступ к элементу в коллекции elements с помощью кода elements[symbol] в C#.

if (elements.ContainsKey(symbol) == false) < Console.WriteLine(symbol + " not found"); >else

В следующем примере метод используется TryGetValue для быстрого поиска элемента по ключу.

if (elements.TryGetValue(symbol, out Element? theElement) == false) Console.WriteLine(symbol + " not found"); else Console.WriteLine("found: " + theElement.Name); 

Итераторы

Итератор используется для выполнения настраиваемого перебора коллекции. Итератор может быть методом или методом доступа get . Итератор использует оператор yield return для возврата всех элементов коллекции по одному за раз.

Итератор вызывается с помощью оператора foreach. Каждая итерация цикла foreach вызывает итератор. При достижении оператора yield return в итераторе возвращается выражение, и текущее расположение в коде сохраняется. При следующем вызове итератора выполнение возобновляется с этого места.

Дополнительные сведения см. в разделе Итераторы (C#).

В приведенном ниже примере используется метод-итератор. Метод итератора содержит yield return инструкцию, которая находится внутри for цикла. В методе ListEvenNumbers каждая итерация тела оператора foreach создает вызов метода-итератора, который переходит к следующему оператору yield return .

private static void ListEvenNumbers() < foreach (int number in EvenSequence(5, 18)) < Console.Write(number.ToString() + " "); >Console.WriteLine(); // Output: 6 8 10 12 14 16 18 > private static IEnumerable EvenSequence( int firstNumber, int lastNumber) < // Yield even numbers in the range. for (var number = firstNumber; number > > 

LINQ и коллекции

Для доступа к коллекциям можно использовать интегрированный с языком запрос (LINQ). Запросы LINQ обеспечивают возможности фильтрации, упорядочения и группировки. Дополнительные сведения см. в разделе Приступая к работе с LINQ в C#.

В приведенном ниже примере выполняется запрос LINQ применительно к универсальной коллекции List . Запрос LINQ возвращает другую коллекцию, содержащую результаты.

private static void ShowLINQ() < Listelements = BuildList(); // LINQ Query. var subset = from theElement in elements where theElement.AtomicNumber < 22 orderby theElement.Name select theElement; foreach (Element theElement in subset) < Console.WriteLine(theElement.Name + " " + theElement.AtomicNumber); >// Output: // Calcium 20 // Potassium 19 // Scandium 21 > private static List BuildList() => new() < < new()< Symbol="K", Name="Potassium", AtomicNumber=19>>, < new()< Symbol="Ca", Name="Calcium", AtomicNumber=20>>, < new()< Symbol="Sc", Name="Scandium", AtomicNumber=21>>, < new()< Symbol="Ti", Name="Titanium", AtomicNumber=22>> >; 

Совместная работа с нами на GitHub

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

Коллекция (программирование)

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

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

Коллекции и контейнеры

Коллекции отличаются от контейнеров тем, что допускают ветвистую структуру и наличием явным образом заданного ограничения, позволяющего приложениям определять точное количество элементов в коллекции. [источник не указан 495 дней]

Классификация

По общим характеристикам

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

По логике организации

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

  • Вектор — элементы коллекции упорядочены, каждый имеет собственный номер, называемый индексом, по которому к нему можно в любой момент обратиться. Как правило, в качестве индексов выступают последовательные целые числа либо значения, приводимые к ним. Для обращения к элементу вектора используется имя вектора и значение индекса. При добавлении нового элемента он добавляется либо в конец вектора, либо в позицию с заданным индексом. Удаление элемента из вектора приводит к образованию пустого элемента.
  • Матрица — элементы имеют два упорядоченных индекса, каждый из которых является целым числом или значением, приводимым к целому. Для доступа к элементу нужно указать имя матрицы и оба индекса. Новый элемент может быть добавлен только в позицию с заданной парой индексов. Удаление приводит к оставлению пустого элемента.
  • Многомерный массив — логическое развитие идеи вектора и матрицы до большего (в общем случае — произвольного) числа индексов.
  • Список — элементы коллекции упорядочены, идентификаторов у элементов нет. Список — коллекция с последовательным доступом. В любой момент доступен первый элемент коллекции (обычно также доступен и последний). От любого элемента коллекции можно получить доступ к следующему по порядку, таким образом, можно последовательно дойти от первого элемента списка до любого желаемого. Возможна реализация, допускающая обратный проход (к предыдущему элементу от известного). Новый элемент может добавляться в начало или в конец списка. При удалении элемента из начала списка первым элементом становится следующий за ним, при удалении из конца — предыдущий, из середины — предыдущий и последующий элементы становятся, соответственно, предыдущим и последующим один для другого.
  • Стек — коллекция, реализующая принцип хранения «LIFO» («последним пришёл — первым вышел»). В стеке постоянно доступен только один элемент — тот, который был добавлен последним. Новый элемент может быть добавлен в стек, он станет текущим. Текущий элемент всегда можно удалить («взять») из стека, после этого становится доступен элемент, который был добавлен непосредственно перед ним.
  • Очередь — коллекция, реализующая принцип хранения «FIFO» («первым пришёл — первым вышел»). В очереди постоянно доступен только один элемент — тот, который был добавлен самым первым из имеющихся. При добавлении нового элемента он попадает в очередь. Текущий элемент можно удалить — тогда текущим станет элемент, добавленный первым из оставшихся.
  • Ассоциативный массив (словарь) — неупорядоченная коллекция, хранящая пары «ключ — значение». Доступ к элементам производится по ключу. В качестве ключа могут использоваться значения различных типов, единственное ограничение — тип ключа должен допускать сравнение на равенство. Любая пара может быть в любой момент удалена. Добавляться может только пара (с определённым ключом). Может вводиться запрет на дублирование ключей в коллекции. Если такого ограничения нет, то при обращении по дублирующемуся ключу может выдаваться либо n-е найденное значение (где n либо постоянно, либо определяется формой запроса), либо все значения с данным ключом.
  • Множество — неупорядоченная коллекция, хранящая набор уникальных значений и поддерживающая для них операции добавления, удаления и определения вхождения. Как правило, для множеств поддерживаются операции, аналогичным операциям с математическими множествами: объединение, пересечение, симметричная разность множеств и несимметричная разность множеств.
  • Мультимножество — неупорядоченная коллекция, аналогичная множеству, но допускающая наличие в коллекции одновременно двух и более одинаковых значений.

По реализации

На уровне реализации коллекция может представлять собой одну из следующих структур данных:

Операции над коллекциями

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

  • Для всех видов коллекций — объединение. Результатом такой операции становится коллекция того же типа, что и операнды, содержащая все элементы, содержащиеся в операндах.
  • Для векторов и матриц, содержащих числовые значения — типичные математические операции над одноимёнными объектами: сложение, вычитание, умножение, транспонирование.
  • Для векторов — извлечения диапазона индексов. Результатом такой операции будет вектор того же типа, содержащий только те элементы исходного, которые попадают в некоторый заданный диапазон.
  • Для векторов и списков — сортировка.
  • Для множеств — объединение, пересечение, разность и симметричная разность.

Известные реализации

  • Glib — библиотека, реализующая большинство коллекций под лицензией GNU LGPL
  • STL — реализация в виде библиотеки шаблонов для C++.

См. также

Примечания

Ссылки

  • apache.org
  • google.com
  • Mango Java library
  • Коллекции и контейнеры в спецификации RDF

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *