Лабораторно упражнение 10

Колекции

Структори от данни

  • Хранилища за данни

  • Основни операции

    • добавяне

    • триене

    • търсене

    • обхождане

Масиви - предимства

предимства
недостатъци

пределно прост "интерфейс"

добавянето или изтриването на елемент (с изключение на последна позиция) е скъпа операция

най-ефективни от гледна точка на използвана памет*

размерът им е фиксиран при инициализацията

бърз достъп на елемент по индекс: O(1)

търсенето на елемент по стойност е бавно: О(N) за произволен масив O(logN) за сортиран масив

Класа Arrays

Arrays дефинира методи за работа с масиви

Arrays.fill - метод за запълване на масиви е една стойност Arrays.sort - метод за сортиране на масиви Arrays.toString - метод за текстово представяне на масиви

Колекции

  • Java предоставя т.нар. collections framework, съдържащ интерфейси, имплементации и алгоритми върху най-използваните структури от данни

  • За разлика от масивите,

    • размерът им е динамичен

    • съдържат само референтни типове

  • Почти всички интерфейси и класове се намират в пакета java.util

Итератори

  • Итераторите предоставят унифициран начин за обхождане на елементите на дадена колекция.

  • Колекциите (както и масивите) могат да се обхождат с foreach loop

  • В java са дефинирани интерфейсите поведението на който се имплементира от всички колекции.

  • Метода next() връща следващия елемент в колекцията

  • Методът remove() премахва от колекцията елемента, последно върнат от next()

  • Ако колекцията бъде модифицирана докато бъде итерирана, по какъвто и да е начин, различен от извикване на remove() на итератора, поведението на итератора е недефинирано води до грешка (ConcurrentModificationException)

Основни структури от данни

  • Масиви

  • Свързани списъци

  • Хеш таблици

  • Дървета

Предефинирани методи за работа с java.util.Collection

Collection е интерфейс, за всички колекции който го имплементират могат да се използват методите:

Пример

Обхождане на колекции

Предефинирани методи за работа с List

List е интерфейс, за всички колекции който го имплементират могат да се използват методите:

Имплементации на List

  • ArrayList - resize-ващ се (динамичен) масив

  • LinkedList - двойно свързан списък

  • Vector - resize-ващ се (динамичен) масив. Synchronized. Legacy

  • Stack - наследява Vector. Legacy -> замества се от Dequeue

Предефинирани методи за работа с Queue

Queue е интерфейс, за всички колекции който го имплементират могат да се използват методите:

Имплементации на Queue

  • PriorityQueue - heap (пирамида)

  • LinkedList

  • ArrayDeque - resize-ващ се (динамичен) масив

Предефинирани методи за работа с Set

Set е интерфейс, за всички колекции който го имплементират могат да се използват методите:

Имплементации на Set

  • TreeSet - TreeMap. Червено-черно дърво

    • конструктори

  • HashSet - хеш таблица

    • конструктори

  • LinkedHashSet - хеш таблица + свързан списък

  • EnumSet - битов масив

Операции над множества със Set

Предефинирани методи за работа с Map

Map е интерфейс, за всички колекции който го имплементират могат да се използват методите:

  • Колекция съпоставяща обект ключ към обект стойност.

  • Не може да съдържа дублирани ключове.

    • При опит за добавяне на съществуващ ключ се променя стойноста

Обхождане на колекции Map

Имплементации на Map

  • HashMap - хеш таблица

  • LinkedHashMap - хеш таблица + свързан списък

  • EnumMap - битов масив

  • TreeMap - червено-черно дърво

Колекции с наредба vs Колекции без наредба

  • TreeMap/TreeSet - червено-черни дървета. Запазват естествена наредба. Елементите трябва да имплементират интерфейса Comparable (или да се подава имплементация на Comparator). Логаритмична сложност за повечето операции

  • HashMap/HashSet - хеш таблици. Нямат естествена наредба. Елементите трябва да имплементират методите hashCode() и equals(). Константна сложност за повечето операции

image

Generics

  • трябва експлицитно да кастваме, което е досадно

  • Опасн е защото има вероятност да сгрешим в предположението си за типа и cast-ът да "гръмне" с ClassCastException по време на изпълнение

  • Много по-удобно

  • програмистът може да изрази намерението си да ползва определен тип и компилаторът може да гарантира коректността на програмата за този тип

Пример

List<E> - // Чете се "списък от E"

Не-generic кутия

Generic кутия

Създаване на инстанции

Конвенция за именуване на параметрите за тип:

  • E - Element

  • T - Type

  • K - Key

  • V - Value

  • N - Number

  • S, U, V etc. - 2-ри, 3-ти, 4-ти тип

Generic методи

  • Могат да ползват типовите параметри на класа/метода

  • Могат да добавят нови параметри за тип, недекларирани от класа

  • Новите параметри за тип са видими единствено за метода, който ги декларира

  • Generic методите могат да са статични, нестатични или конструктори

Пример

Generic типове и наследяване

  • Integer is-a Object

  • Integer is-a Number

  • Double is-a Number

  • Box is-not-а Box (Техният общ родител е Object)

Ограничени (bounded/restricted) Generic типове

Може да се специфицира, че generic тип е съвместим само с даден тип или негови наследници/имплементации (upper bound).

Generic и колекции

  • Всички ипове колекции имат Generic еквивалент което позволява използването на предефинираните алгоритми върху колекции с програмно дефинирани обекти.

  • За да могат да бъдат използвани е необходимо дефиниране на:

    • интерфейса Comparable

    • метода hashCode()

    • метода equals()

Сортиране на колекции

Класа Collections съържа функции за сортиране на колекции.

Функцията Collections.sort приема като входен параметър функцията която трябва да се сортира.

Критерия по който ще се сортира колекцията се подава като втори параметър посредством обект от клас имплементиращ интерфейса Comparator.

Пример

Метода compare служи за сравнение на два обекта от колекцията. Той връща като резултат

  • -1 ако левия обект е по малък

  • 0 ако двата обекта са равни

  • 1 ако деснич обект е по малък

Last updated

Was this helpful?