Коллекции. Часть 1.Лекция 8

Содержание

Слайд 2

Что такое Java Collections Framework? Коллекции – это хранилища, поддерживающие различные

Что такое Java Collections Framework?

Коллекции – это хранилища, поддерживающие различные способы

накопления и упорядочения объектов с целью обеспечения возможностей эффективного доступа к ним.
Добавлены в версии J2SЕ 1.2.
Collection Framework состоит из 3-х частей:
Интерфейсы
Реализации (классы)
Алгоритмы
Слайд 3

Иерархия интерфейсов коллекции

Иерархия интерфейсов коллекции

Слайд 4

Интерфейс Collection Интерфейс Collection - вершина иерархии коллекций, который определяет наименьший набор характеристик, реализуемых всеми коллекциями.

Интерфейс Collection

Интерфейс Collection - вершина иерархии коллекций, который определяет наименьший набор

характеристик, реализуемых всеми коллекциями.
Слайд 5

Методы интерфейса Collection boolean add(E obj) Добавляет obj к вызывающей коллекции.

Методы интерфейса Collection

boolean add(E obj)
Добавляет obj к вызывающей коллекции. Возвращает

true, если obj был добавлен к коллекции.
Слайд 6

Методы интерфейса Collection boolean addAll (Collection с) Добавляет все элементы к

Методы интерфейса Collection

boolean addAll (Collection с)
Добавляет все элементы к

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

Методы интерфейса Collection void clear() Удаляет все элементы вызывающей коллекции.

Методы интерфейса Collection

void clear()
Удаляет все элементы вызывающей коллекции.

Слайд 8

Методы интерфейса Collection boolean contains(Object obj) Возвращает true, если obj является

Методы интерфейса Collection

boolean contains(Object obj)
Возвращает true, если obj является элементом

вызывающей коллекции. В противном случае возвращает false.
Слайд 9

Методы интерфейса Collection boolean containsAll(Collection с) Возвращает true, если вызывающая коллекция

Методы интерфейса Collection

boolean containsAll(Collection с)
Возвращает true, если вызывающая коллекция содержит все

элементы с. В противном случае возвращает false.
Слайд 10

Методы интерфейса Collection boolean isEmpty() Возвращает true, если вызывающая коллекция пуста. В противном случае возвращает false.

Методы интерфейса Collection

boolean isEmpty()
Возвращает true, если вызывающая коллекция пуста. В противном

случае возвращает false.
Слайд 11

Методы интерфейса Collection boolean remove(Object obj) Удаляет один экземпляр obj из

Методы интерфейса Collection

boolean remove(Object obj)
Удаляет один экземпляр obj из вызывающей

коллекции. Возвращает true, если элемент удален. В противном случае возвращает false.
Слайд 12

Методы интерфейса Collection boolean removeAll(Collection с) Удаляет все элементы из вызывающей

Методы интерфейса Collection

boolean removeAll(Collection с)
Удаляет все элементы из вызывающей коллекции. Возвращает

truе, если в результате коллекция изменяется (то есть элементы удалены). В противном случае возвращает false.
Слайд 13

Методы интерфейса Collection int size() Возвращает количество элементов, содержащихся в коллекции.

Методы интерфейса Collection

int size()
Возвращает количество элементов, содержащихся в коллекции.

Слайд 14

Методы интерфейса Collection Удаляет элементы из коллекции, соответствующие заданному условию. default boolean removeIf(Predicate filter)

Методы интерфейса Collection
Удаляет элементы из коллекции, соответствующие заданному условию.

default boolean removeIf(Predicate

super E> filter)
Слайд 15

Интерфейс Collection

Интерфейс Collection

Слайд 16

Интерфейс Collection

Интерфейс Collection

Слайд 17

Интерфейс Collection

Интерфейс Collection

Слайд 18

Интерфейс Collection

Интерфейс Collection

Слайд 19

Основные структуры данных Список Стек Очередь Множество

Основные структуры данных

Список
Стек
Очередь
Множество

Слайд 20

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

Список

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

на следующий (или для двусвязного списка и на следующий и на предыдущий) элементы списка. Иногда называется sequence. Разрешаются повторы.
Слайд 21

Стек Стек — это коллекция, элементы которой получают по принципу «последний

Стек

Стек — это коллекция, элементы которой получают по принципу «последний вошел,

первый вышел» (Last-In-First-Out или LIFO). Это значит, что мы будем иметь доступ только к последнему добавленному элементу.
Слайд 22

Очередь Очереди очень похожи на стеки. Они также не дают доступа

Очередь

Очереди очень похожи на стеки. Они также не дают доступа к

произвольному элементу, но, в отличие от стека, элементы помещаются (enqueue) и забираются (dequeue) с разных концов. Такой метод называется «первый вошел, первый вышел» (First-In-First-Out или FIFO). То есть забирать элементы из очереди мы будем в том же порядке, что и помещали. Как реальная очередь или конвейер.
Слайд 23

Множество Множество — неупорядоченный набор элементов, без повторов.

Множество

Множество — неупорядоченный набор элементов, без повторов.

Слайд 24

Интерфейс List

Интерфейс List

Слайд 25

Интерфейс List Интерфейс List сохраняет последовательность добавления элементов и позволяет осуществлять доступ к элементу по индексу.

Интерфейс List

Интерфейс List сохраняет последовательность добавления элементов и позволяет осуществлять доступ

к элементу по индексу.
Слайд 26

Методы интерфейса List void add(int index, Е obj) Вставляет obj в

Методы интерфейса List

void add(int index, Е obj)
Вставляет obj в вызывающий

список в позицию, указанную в index. Любые ранее вставленные элементы за указанной позицией вставки смещаются вверх. То есть никакие элементы не перезаписываются.
Слайд 27

Методы интерфейса List bооlеаn addAll (int index, Collection с) Вставляет все

Методы интерфейса List

bооlеаn addAll (int index, Collection с)
Вставляет

все элементы в вызывающий список, начиная с позиции, переданной в index. Все ранее существовавшие элементы за точкой вставки смещаются вверх. То есть никакие элементы не перезаписываются. Возвращает true, если вызывающий список изменяется, и false в противном случае.
Слайд 28

Методы интерфейса List Е get (int index) Возвращает объект, сохраненный в указанной позиции вызывающего списка.

Методы интерфейса List

Е get (int index)
Возвращает объект, сохраненный в указанной позиции

вызывающего списка.
Слайд 29

Методы интерфейса List int indexOf(Object obj) Возвращает индекс первого экземпляра obj

Методы интерфейса List

int indexOf(Object obj)
Возвращает индекс первого экземпляра obj в

вызывающем списке. Если obj не содержится в списке, возвращается -1.
Слайд 30

Методы интерфейса List int lastlndexOf(Object obj) Возвращает индекс последнего экземпляра obj

Методы интерфейса List

int lastlndexOf(Object obj)
Возвращает индекс последнего экземпляра obj в

вызывающем списке. Если obj не содержится в списке, возвращается -1.
Слайд 31

Методы интерфейса List Е remove(int index) Удаляет элемент из вызывающего списка

Методы интерфейса List

Е remove(int index)
Удаляет элемент из вызывающего списка в

позиции index и возвращает удаленный элемент. Результирующий список уплотняется, то есть элементы, следующие за удаленным, сдвигаются на одну позицию назад.
Слайд 32

Методы интерфейса List Е set (int index, Е obj) Присваивает obj

Методы интерфейса List

Е set (int index, Е obj)
Присваивает obj элементу,

находящемуся в списке в позиции index.
Слайд 33

Методы интерфейса List List subList (int start, int end) Возвращает список,

Методы интерфейса List

List subList (int start, int end)
Возвращает список, включающий

элементы от start до end-1 из вызывающего списка. Элементы из возвращаемого списка также сохраняют ссылки в вызывающем списке.
Слайд 34

Интерфейс List

Интерфейс List

Слайд 35

Интерфейс List

Интерфейс List

Слайд 36

Интерфейс List

Интерфейс List

Слайд 37

Класс ArrayList ArrayList поддерживает динамические массивы, которые могут расти по мере

Класс ArrayList

ArrayList поддерживает динамические массивы, которые могут расти по мере необходимости.


Элементы ArrayList могут быть абсолютно любых типов в том числе и null.
Слайд 38

Внутреннее представление класса ArrayList Объект класса ArrayList, содержит свойства elementData и

Внутреннее представление класса ArrayList

Объект класса ArrayList, содержит свойства elementData и size.
Хранилище

значений elementData есть ни что иное как массив определенного типа (указанного в generic).
Слайд 39

Внутреннее представление класса ArrayList Когда внутренний массив заполняется, ArrayList создает внутри

Внутреннее представление класса ArrayList

Когда внутренний массив заполняется, ArrayList создает внутри себя новый массив.


Его размер = (размер старого массива * 1,5) +1.
Все данные копируются из старого массива в новый
Старый массив удаляется сборщиком мусора.
Слайд 40

Конструкторы класса ArrayList ArrayList () ArrayList(Collection с) ArrayList(int capacity)

Конструкторы класса ArrayList

ArrayList ()
ArrayList(Collection с)
ArrayList(int capacity)


Слайд 41

Достоинства и недостатки класса ArrayList Достоинства Быстрый доступ по индексу -

Достоинства и недостатки класса ArrayList

Достоинства
Быстрый доступ по индексу - O(1).
Быстрая вставка

и удаление элементов с конца - O(1).
Недостатки
Медленная вставка и удаление элементов в середину – O(n).
Слайд 42

Методы класса ArrayList для добавления элементов boolean add(E obj) - добавляет

Методы класса ArrayList для добавления элементов

boolean add(E obj) - добавляет obj

к вызывающей коллекции. Возвращает true, если obj был добавлен к коллекции. (Интерфейс Collection)
void add(int index, Е obj) - вставляет obj в вызывающий список в позицию, указанную в index. Любые ранее вставленные элементы за указанной позицией вставки смещаются вверх. То есть никакие элементы не перезаписываются. (Интерфейс List)
Е set (int index, Е obj) - присваивает obj элементу, находящемуся в списке в позиции index. (Интерфейс List)
boolean addAll (Collection с) - добавляет все элементы к вызывающей коллекции. Возвращает true, если операция удалась (то есть все элементы добавлены). В противном случае возвращает false. (Интерфейс Collection)
Слайд 43

Добавление эл-в в ArrayList public class ArrayListAddDemo { public static void

Добавление эл-в в ArrayList

public class ArrayListAddDemo { public static void main(String[]

args) { List arrayList = new ArrayList<>(); System.out.println("Начальный размер arrayList: " + arrayList.size()); arrayList.add("C"); arrayList.add("A"); arrayList.add("E"); arrayList.add("B"); arrayList.add("D"); arrayList.add("F"); arrayList.add("F"); arrayList.add(1, "A2"); arrayList.set(0, "C2"); System.out.println("Размер arrayList после добавления: " + arrayList.size()); System.out.println("Содержимое arrayList: " + arrayList); } }
Слайд 44

Методы класса ArrayList для удаления элементов boolean remove(Object obj) - удаляет

Методы класса ArrayList для удаления элементов

boolean remove(Object obj) - удаляет один

экземпляр obj из вызывающей коллекции. Возвращает true, если элемент удален. В противном случае возвращает false. (Интерфейс Collection)
Е remove(int index) - удаляет элемент из вызывающего списка в позиции index и возвращает удаленный элемент. Результирующий список уплотняется, то есть элементы, следующие за удаленным, сдвигаются на одну позицию назад. (Интерфейс List)
boolean removeAll(Collection с) - удаляет все элементы из вызывающей коллекции. Возвращает truе, если в результате коллекция изменяется (то есть элементы удалены). В противном случае возвращает false. (Интерфейс Collection)
boolean retainAll(Collection с) - удаляет все элементы кроме входящих из вызывающей коллекции. Возвращает true, если в результате коллекция изменяется (то есть элементы удалены). В противном случае возвращает false. (Интерфейс Collection)
void clear() - удаляет все элементы вызывающей коллекции. (Интерфейс Collection)
Слайд 45

Удаление эл-в из ArrayList public class ArrayListRemoveDemo { public static void

Удаление эл-в из ArrayList

public class ArrayListRemoveDemo { public static void main(String[]

args) { List arrayList = new ArrayList<>(); arrayList.add("C"); arrayList.add("A"); arrayList.add("E"); arrayList.add("B"); arrayList.add("D"); arrayList.add("F"); arrayList.add("F"); arrayList.add(1, "A2"); arrayList.set(0, "C2"); System.out.println("Содержимое arrayList: " + arrayList); System.out.println("Размер arrayList после добавления: " + arrayList.size()); arrayList.remove("F"); arrayList.remove(2); System.out.println("Размер arrayList после удаления: " + arrayList.size()); System.out.println("Содержимое of arrayList: " + arrayList); } }
Слайд 46

Пример использования removeAll() класса ArrayList public class ArrayListRemoveAllDemo { public static

Пример использования removeAll() класса ArrayList

public class ArrayListRemoveAllDemo { public static void

main(String[] args) { List arrayList = new ArrayList<>(); arrayList.add("C"); arrayList.add("A"); arrayList.add("E"); arrayList.add("B"); arrayList.add("D"); arrayList.add("F"); arrayList.add("F"); arrayList.add(1, "A2"); arrayList.set(0, "C2"); List removeElements = List.of("C2", "A2", "AA", "F"); System.out.println("Содержимое arrayList до removeAll: " + arrayList); arrayList.removeAll(removeElements); System.out.println("Содержимое arrayList после removeAll: " + arrayList); } }
Слайд 47

Пример использования методов addAll(), clear() класса ArrayList public class ArrayListDemo2 {

Пример использования методов addAll(), clear() класса ArrayList

public class ArrayListDemo2 { public

static void main(String[] args) { List arrayList1 = new ArrayList<>(); List arrayList2 = List.of("1", "2"); arrayList1.add("A"); arrayList1.add("B"); arrayList1.add("C"); arrayList1.add("D"); arrayList1.add("E"); arrayList1.add("F"); System.out.println("arrayList1 до добавления " + arrayList1); arrayList1.addAll(3, arrayList2); System.out.println("arrayList1 после добавления " + arrayList1); arrayList1.clear(); System.out.println("arrayList1 после очистки " + arrayList1); } }
Слайд 48

Пример использования методов retainAll() класса ArrayList public class ArrayListRetainAllDemo { public

Пример использования методов retainAll() класса ArrayList

public class ArrayListRetainAllDemo { public static

void main(String[] args) { List arrayList1 = new ArrayList<>(); List arrayList2 = List.of("F", "FF", "E"); arrayList1.add("A"); arrayList1.add("A"); arrayList1.add("B"); arrayList1.add("C"); arrayList1.add("D"); arrayList1.add("E"); arrayList1.add("F"); arrayList1.add("F"); arrayList1.retainAll(arrayList2); System.out.println(arrayList1); } }
Слайд 49

Получение массива из коллекции типа ArrayList Имеются два варианта метода toArray(),

Получение массива из коллекции типа ArrayList

Имеются два варианта метода toArray(), которые

объявлены в Collection:
Object [] toArray()
<Т> Т [] toArray(Т массив[])
Слайд 50

Получение массива из коллекции типа ArrayList public class ArrayListToStringDemo { public

Получение массива из коллекции типа ArrayList

public class ArrayListToStringDemo { public static

void main(String[] args) { List arrayList = List.of("C", "A", "E", "B", "D", "F"); //1 вариант Object[] objectArray = arrayList.toArray(); System.out.println(Arrays.toString(objectArray)); //2 вариант String[] stringArray1 = new String[arrayList.size()]; arrayList.toArray(stringArray1); System.out.println(Arrays.toString(stringArray1)); //3 вариант String[] stringArray2 = arrayList.toArray(new String[0]); System.out.println(Arrays.toString(stringArray2)); } }
Слайд 51

Интерфейс Set

Интерфейс Set

Слайд 52

Интерфейс Set Интерфейс Set определяет множество (набор). Он расширяет Collection и

Интерфейс Set

Интерфейс Set определяет множество (набор).
Он расширяет Collection и определяет поведение

коллекций, не допускающих дублирования элементов.
Таким образом, метод add() возвращает false, если делается попытка добавить дублированный элемент в набор.
Он не определяет никаких собственных дополнительных методов.
Слайд 53

Интерфейс Set Интерфейс Set заботится об уникальности хранимых объектов, уникальность определятся реализацией метода equals().

Интерфейс Set

Интерфейс Set заботится об уникальности хранимых объектов, уникальность определятся реализацией

метода equals().
Слайд 54

Класс HashSet Класс HashSet реализует интерфейс Set. Он создает коллекцию, которая

Класс HashSet

Класс HashSet реализует интерфейс Set.
Он создает коллекцию, которая используется

для хранения хеш-таблиц.
Разрешено добавлять null значения.
Слайд 55

Что такое хэш-таблица? Элементы таблицы хранятся в виде пар ключ-значение. Ключ

Что такое хэш-таблица?

Элементы таблицы хранятся в виде пар ключ-значение. 
Ключ определяет ячейку

для хранения значения.
Содержимое ключа служит для определения однозначного значения, называемого хеш-кодом.
Мы можем считать, что хеш-код это ID объекта, хотя он не должен быть уникальным.
Этот хеш-код служит далее в качестве индекса, по которому сохраняются данные, связанные с ключом.
Слайд 56

Использование hashCode()

Использование hashCode()

Слайд 57

Правила написания методов hashCode() и equals() Для одного и того же

Правила написания методов hashCode() и equals()

Для одного и того же объекта,

хеш-код всегда будет одинаковым.
Если объекты одинаковые, то и хеш-коды одинаковые (но не наоборот).
Если хеш-коды равны, то входные объекты не всегда равны.
Если хеш-коды разные, то и объекты гарантированно разные.
Слайд 58

Конструкторы HashSet HashSet() - начальная емкость по умолчанию – 16, коэффициент

Конструкторы HashSet

HashSet() - начальная емкость по умолчанию – 16, коэффициент загрузки

– 0,75.
HashSet(int initialCapacity) - Коэффициент загрузки – 0,75.
HashSet(int initialCapacity, float loadFactor)
HashSet(Collection C) – конструктор, добавляющий элементы из другой коллекции.
Слайд 59

Начальная емкость и коэффициент загрузки Начальная емкость (initial capacity)– изначальное количество

Начальная емкость и коэффициент загрузки

Начальная емкость (initial capacity)– изначальное количество ячеек

(buckets) в хэш-таблице.
Если все ячейки будут заполнены, их количество увеличится автоматически.
Коэффициент загрузки (load factor) – показатель того, насколько заполненным может быть HashSet до того момента, когда его емкость автоматически увеличится.
Когда количество элементов в HashSet становится больше, чем capacity*loadfactor, хэш-таблица ре-хэшируется (заново вычисляются хэшкоды элементов, и таблица перестраивается согласно полученным значениям) и количество buckets в ней увеличивается в 2 раза.
Коэффициент загрузки, равный 0,75, в среднем обеспечивает хорошую производительность. Если этот параметр увеличить, тогда уменьшится нагрузка на память (так как это уменьшит количество операций ре-хэширования и перестраивания), но это повлияет на операции добавления и поиска. Чтобы минимизировать время, затрачиваемое на ре-хэширование, нужно правильно подобрать параметр начальной емкости.
Слайд 60

Класс HashSet Выгода от хеширования состоит в том, что оно обеспечивает

Класс HashSet

Выгода от хеширования состоит в том, что оно обеспечивает постоянство

время выполнения операций add(), contains(), remove() и size(), даже для больших наборов – O(1). В худшем случае (если один bucket) время будет O(n) для Java 7 и О(log n) для Java 8.
Класс HashSet не гарантирует упорядоченности элементов, поскольку процесс хеширования сам по себе обычно не приводит к созданию отсортированных множеств.
Слайд 61

Пример использования класса HashSet public class HashSetDemo { public static void

Пример использования класса HashSet

public class HashSetDemo { public static void main(String[]

args) { Set hashSet = new HashSet<>(); hashSet.add("Харьков"); hashSet.add("Киев"); hashSet.add("Львов"); hashSet.add("Кременчуг"); hashSet.add("Харьков"); System.out.println(hashSet); } }
Слайд 62

Клacc LinkedHashSet Класс LinkedHashSet расширяет HashSet, не добавляя никаких новых методов.

Клacc LinkedHashSet

Класс LinkedHashSet расширяет HashSet, не добавляя никаких новых методов.
LinkedHashSet

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

Пример класса LinkedHashSet public class LinkedHashSetDemo { public static void main(String[]

Пример класса LinkedHashSet

public class LinkedHashSetDemo { public static void main(String[] args)

{ Set linkedHashSet = new LinkedHashSet<>(); linkedHashSet.add("Харьков"); linkedHashSet.add("Киев"); linkedHashSet.add("Львов"); linkedHashSet.add("Кременчуг"); linkedHashSet.add("Харьков"); System.out.println(linkedHashSet); } }
Слайд 64

Интерфейс SortedSet Интерфейс SortedSet из пакета java.util, расширяющий интерфейс Set, описывает

Интерфейс SortedSet

Интерфейс SortedSet из пакета java.util, расширяющий интерфейс Set, описывает упорядоченное

множество, отсортированное по естественному порядку возрастания его элементов или по порядку, заданному реализацией интерфейса Comparator.
Слайд 65

Класс TreeSet TreeSet – реализует интерфейс NavigableSet , который поддерживает элементы

Класс TreeSet

TreeSet – реализует интерфейс NavigableSet, который поддерживает элементы в отсортированном

по возрастанию порядке.
Объекты сохраняются в отсортированном порядке по нарастающей.
Обработка операций удаления и вставки объектов происходит медленнее O(log (n)), чем в хэш-множествах, но быстрее, чем в списках.
Слайд 66

Пример использования класса TreeSet public class TreeSetDemo1 { public static void

Пример использования класса TreeSet

public class TreeSetDemo1 { public static void main(String[]

args) { SortedSet treeSet = new TreeSet<>(); treeSet.add("Харьков"); treeSet.add("Киев"); treeSet.add("Львов"); treeSet.add("Кременчуг"); treeSet.add("Харьков"); System.out.println(treeSet); } }
Слайд 67

Методы интерфейса SortedSet

Методы интерфейса SortedSet

Слайд 68

Пример использования методов subSet(), headSet(), tailSet(), first(), last() public class TreeSetDemo2

Пример использования методов subSet(), headSet(), tailSet(), first(), last()

public class TreeSetDemo2 {

public static void main(String[] args) { SortedSet treeSet = new TreeSet<>(); treeSet.add("Харьков"); treeSet.add("Киев"); treeSet.add("Львов"); treeSet.add("Кременчуг"); treeSet.add("Харьков"); System.out.println(treeSet); SortedSet subSet = treeSet.subSet("Киев", "Львов"); System.out.println("SubSet: " + subSet); System.out.println("HeadSet: " + treeSet.headSet("Львов")); System.out.println("TailSet: " + treeSet.tailSet("Львов")); System.out.println("Первый элемент: " + treeSet.first()); System.out.println("Последний элемент: " + treeSet.last()); } }
Слайд 69

Сравнение объектов Существует два способа сравнения объектов: С помощью интерфейса Comparable

Сравнение объектов

Существует два способа сравнения объектов:
С помощью интерфейса Comparable.
С помощью

интерфейса Comparator.
Слайд 70

Интерфейс Comparable Для того, чтобы объекты можно было сравнить и сортировать,

Интерфейс Comparable

Для того, чтобы объекты можно было сравнить и сортировать, они должны

реализовать интерфейс Comparable.
Интерфейс Comparable содержит один единственный метод int compareTo(T item), который сравнивает текущий объект с объектом, переданным в качестве параметра.
Если этот метод возвращает отрицательное число, то текущий объект будет располагаться перед тем, который передается через параметр.
Если метод вернет положительное число, то, наоборот, после второго объекта.
Если метод возвращает ноль, значит, оба объекта равны.
Слайд 71

Пример использования Comparable public class Person implements Comparable { private String

Пример использования Comparable

public class Person implements Comparable { private String firstName;

private String lastName; private int age; public Person(String firstName, String lastName, int age) { this.firstName = firstName; this.lastName = lastName; this.age = age; } … @Override public int compareTo(Person anotherPerson) { int anotherPersonAge = anotherPerson.getAge(); return this.age - anotherPersonAge; } }
Слайд 72

Пример использования Comparable public class ComparePersonDemo { public static void main(String[]

Пример использования Comparable

public class ComparePersonDemo { public static void main(String[] args)

{ SortedSet set = new TreeSet<>(); set.add(new Person("Саша", "Иванов", 36)); set.add(new Person("Маша", "Петрова", 23)); set.add(new Person("Даша", "Сидорова", 34)); set.add(new Person("Вася", "Иванов", 25)); set.forEach(System.out::println); } }
Слайд 73

Интерфейс Comparator Интерфейс Comparator содержит метод: int compare(T o1, T o2).

Интерфейс Comparator

Интерфейс Comparator содержит метод:
int compare(T o1, T o2).
Метод compare также возвращает числовое

значение - если оно отрицательное, то объект o1 предшествует объекту o2, иначе - наоборот. А если метод возвращает ноль, то объекты равны.
Для применения интерфейса нам вначале надо создать класс компаратора, который реализует этот интерфейс.
Слайд 74

Пример использования Comparator public class PersonComparator implements Comparator { @Override public

Пример использования Comparator

public class PersonComparator implements Comparator { @Override public int

compare(Person o1, Person o2) { return o1.getLastName().compareTo(o2.getLastName()); } }
Слайд 75

Пример использования Comparator public class PersonComparatorDemo { public static void main(String[]

Пример использования Comparator

public class PersonComparatorDemo { public static void main(String[] args)

{ PersonComparator personComparator = new PersonComparator(); SortedSet set = new TreeSet<>(personComparator); set.add(new Person("Саша", "Иванов", 36)); set.add(new Person("Маша", "Петрова", 23)); set.add(new Person("Даша", "Сидорова", 34)); set.add(new Person("Вася", "Иванов", 25)); //Обратите внимание - было добавлено 4 элемента, но распечатано 3 set.forEach(System.out::println); } }
Слайд 76

Пример использования Comparator.comparing() public class PersonComparingDemo { public static void main(String[]

Пример использования Comparator.comparing()

public class PersonComparingDemo { public static void main(String[] args)

{ Comparator personComparator = Comparator.comparing(Person::getLastName)
.thenComparing(Person::getAge); SortedSet set = new TreeSet<>(personComparator); set.add(new Person("Саша", "Иванов", 36)); set.add(new Person("Маша", "Петрова", 23)); set.add(new Person("Даша", "Сидорова", 34)); set.add(new Person("Вася", "Иванов", 25)); set.forEach(System.out::println); } }
Слайд 77

Конструкторы класса TreeSet TreeSet имеет следующие конструкторы: TreeSet() TreeSet(Collection сollection) TreeSet(Comparator соmрarator) TreeSet(SortedSet sortedSet) https://javarush.ru/quests/lectures/questcollections.level06.lecture07

Конструкторы класса TreeSet

TreeSet имеет следующие конструкторы:
TreeSet()
TreeSet(Collection сollection)
TreeSet(Comparator

super Е> соmрarator)
TreeSet(SortedSet sortedSet)
https://javarush.ru/quests/lectures/questcollections.level06.lecture07
Слайд 78

Интерфейс NavigableSet Интерфейс NavigableSet появился в Java SE 6. Он расширяет

Интерфейс NavigableSet

Интерфейс NavigableSet появился в Java SE 6.
Он расширяет SortedSet

и добавляет методы для более удобного поиска по коллекции.
Слайд 79

Интерфейс NavigableSet

Интерфейс NavigableSet

Слайд 80

Интерфейс NavigableSet

Интерфейс NavigableSet

Слайд 81

Интерфейс NavigableSet

Интерфейс NavigableSet

Слайд 82

Пример использования NavigableSet public class Ferry { public static void main(String[]

Пример использования NavigableSet

public class Ferry { public static void main(String[]

args) { NavigableSet times = new TreeSet<>(); times.add(1205); times.add(1505); times.add(1545); times.add(1830); times.add(2010); times.add(2100); // Java 5 версия System.out.println("Java 5"); SortedSet subset = times.headSet(1600); System.out.println("Последний паром перед 16:00 - " + subset.last()); SortedSet tailSet = times.tailSet(2000); System.out.println("Первый паром после 20:00 - " + tailSet.first()); System.out.println(); // Java 6 версия исполтзует новые методы lower() и higher() System.out.println("Java 6"); System.out.println("Последний паром перед 16:00 - " + times.lower(1600)); System.out.println("Первый паром после 20:00 - " + times.higher(2000)); } }
Слайд 83

Интерфейс Queue Интерфейс Queue расширяет Collection и объявляет поведение очередей, которые

Интерфейс Queue

Интерфейс Queue расширяет Collection и объявляет поведение очередей, которые представляют

собой список с дисциплиной "первый вошел первый вышел“ (FIFO).
Cуществуют разные типы очередей, в которых порядок основан на некотором критерии.
Очереди не могут хранить null.
Слайд 84

Интерфейс Queue

Интерфейс Queue

Слайд 85

Методы Queue

Методы Queue

Слайд 86

Пример методов offer(), peek(), poll() public class QueueExample { public static

Пример методов offer(), peek(), poll()

public class QueueExample { public static void

main(String[] args) { Queue queue = new LinkedList<>(); queue.offer("Харьков"); queue.offer("Киев"); queue.offer("Кременчуг"); queue.offer("Львов"); System.out.println(queue.peek()); String town; while ((town = queue.poll()) != null) { System.out.println(town); } } }
Слайд 87

Интерфейс Deque

Интерфейс Deque

Слайд 88

Интерфейс Deque Интерфейс Deque (double-ended queue) появился в Java 6. Он

Интерфейс Deque

Интерфейс Deque (double-ended queue) появился в Java 6.
Он расширяет

Queue и описывает поведение двунаправленной очереди.
Двунаправленная очередь может функционировать как стандартная очередь FIFO либо как стек LIFO.
Слайд 89

Методы Deque

Методы Deque

Слайд 90

Методы Deque

Методы Deque

Слайд 91

Методы Deque

Методы Deque

Слайд 92

Методы Deque

Методы Deque

Слайд 93

Класс ArrayDeque ArrayDeque создает двунаправленную очередь. Конструкторы: ArrayDeque(); // создает пустую

Класс ArrayDeque

ArrayDeque создает двунаправленную очередь.
Конструкторы:
ArrayDeque(); // создает пустую двунаправленную очередь

с вместимостью 16 элементов
ArrayDeque(Collection c); // создает двунаправленную очередь из элементов коллекции c в том порядке, в котором они возвращаются итератором коллекции c.
ArrayDeque(int numElements); // создает пустую двунаправленную очередь с вместимостью numElements.
Слайд 94

Пример использования класса ArrayDeque public class ArrayDequeExample { public static void

Пример использования класса ArrayDeque

public class ArrayDequeExample { public static void main(String[]

args) { Deque stack = new ArrayDeque<>(); Deque queue = new ArrayDeque<>(2); stack.push("A"); stack.push("B"); stack.push("C"); stack.push("D"); while (!stack.isEmpty()) { System.out.print(stack.pop() + " "); } System.out.println(); queue.offer("A"); queue.offer("B"); queue.offer("C"); queue.offer("D"); while (!queue.isEmpty()) { System.out.print(queue.remove() + " "); } } }
Слайд 95

Класс LinkedList Класс LinkedList реализует интерфейсы List, Deque. LinkedList – это

Класс LinkedList

Класс LinkedList реализует интерфейсы List, Deque.
LinkedList – это двухсвязный

список.
Конструкторы:
LinkedList()
LinkedList(Collection с)
Слайд 96

Класс LinkedList

Класс LinkedList

Слайд 97

Внутренняя организация класса LinkedList Внутри класса LinkedList существует static inner класс

Внутренняя организация класса LinkedList

Внутри класса LinkedList существует static inner класс

Entry, с помощью которого создаются новые элементы.
private static class Entry
{
E element;
Entry next;
Entry prev;
Entry(E element, Entry next, Entry prev)
{
this.element = element;
this.next = next;
this.prev = prev;
}
}
Слайд 98

Пример использования LinkedList public class LinkedListDemo { public static void main(String[]

Пример использования LinkedList

public class LinkedListDemo { public static void main(String[] args)

{ LinkedList list = new LinkedList<>(); list.add("F"); list.add("B"); list.add("D"); list.add("E"); list.add("C"); list.addLast("Z"); list.addFirst("A"); list.add(1, "A2"); System.out.println("Содержимое: " + list); list.remove("F"); list.remove(2); list.removeFirst(); list.removeLast(); System.out.println("Содержимое после удаления: " + list); String val = list.get(2); list.set(2, val + "+"); System.out.println("Содержимое после изменения: " + list); } }
Слайд 99

Класс LinkedList Из LinkedList можно организовать стэк, очередь, или двойную очередь.

Класс LinkedList

Из LinkedList можно организовать стэк, очередь, или двойную очередь.
На вставку

и удаление из середины списка, получение элемента по индексу или значению потребуется линейное время O(n).
Однако, на добавление и удаление из середины списка, используя ListIterator.add() и ListIterator.remove(), потребуется O(1);
Позволяет добавлять любые значения в том числе и null.
Слайд 100

Класс PriorityQueue

Класс PriorityQueue

Слайд 101

Класс PriorityQueue PriorityQueue – это класс очереди с приоритетами. По умолчанию

Класс PriorityQueue

PriorityQueue – это класс очереди с приоритетами.
По умолчанию

очередь с приоритетами размещает элементы согласно естественному порядку сортировки используя Comparable.
Элементу с наименьшим значением присваивается наибольший приоритет.
Если несколько элементов имеют одинаковый наивысший элемент – связь определяется произвольно.
Также можно указать специальный порядок размещения, используя Comparator.
Слайд 102

Конструкторы PriorityQueue PriorityQueue(); // создает очередь с приоритетами начальной емкостью 11,

Конструкторы PriorityQueue

PriorityQueue(); // создает очередь с приоритетами начальной емкостью 11, размещающую

элементы согласно естественному порядку сортировки (Comparable).
PriorityQueue(Collection c);
PriorityQueue(int initialCapacity);
PriorityQueue(int initialCapacity, Comparator comparator);
PriorityQueue(PriorityQueue c);
PriorityQueue(SortedSet c);