Слайд 1Программирование на Java
Тема 5.2Коллекции
Слайд 2 Интерфейс Comparable
public interface Comparable
{ public int compareTo(T obj); }
Слайд 3 Интерфейс Comparable
В интерфейсе Comparable объявлен всего один метод compareTo(T obj),
предназначенный для реализации упорядочивания объектов класса. Его удобно использовать при
сортировке упорядоченных списков или массивов объектов.
Данный метод сравнивает объект, вызывающий метод с объектом obj. В отличие от метода equals, который возвращает true или false, compareTo возвращает:
0, если значения равны;
Отрицательное значение, если вызывающий объект меньше параметра;
Положительное значение , если вызывающий объект больше параметра.
Метод может выбросить исключение ClassCastException, если типы объектов не совместимы при сравнении.
Необходимо помнить, что аргумент метода compareTo имеет тип сравниваемого объекта класса.
Классы Byte, Short, Integer, Long, Double, Float, Character, String , Date уже реализуют интерфейс Comparable.
См. на сл. слайде пример реализующий интерфейс Comparable.
Слайд 8 Интерфейс Comparator
public interface Comparator
{ int compare(T obj1, T obj2);
equals(T obj).
}
Слайд 9 Интерфейс Comparator
В интерфейсе Comparator объявлено два метода compare(T obj1, T
obj2) и equals(T obj).
compare(T obj1, T obj2) – так же, как и метод compareTo интерфейса Comparable, упорядочивает объекты
класса. Точно так же на выходе получает 0, положительное значение и отрицательное значение.
Метод может выбросить исключение ClassCastException, если типы объектов не совместимы при сравнении.
Основным отличием интерфейса Comparator от Comparable является то, что вы можете создавать несколько видов независимых сортировок.
equals(T obj) - сравнивает компараторы объектов. Переопределяется очень редко.
См. на сл. слайде пример реализующий интерфейс Comparator.
Слайд 14 Интерфейс Set
public interface Set extends Collection
{ int
size();
boolean isEmpty();
boolean contains(Object element);
boolean add(E element);
boolean remove(Object element);
Iterator
iterator();
boolean containsAll(Collection> c);
boolean addAll(Collection extends E> c);
boolean removeAll(Collection> c);
void clear();
Object[] toArray();
…
}
Слайд 15 Интерфейс SortedSet
public interface SortedSet extends Set
{ Comparator
toElement);
SortedSet subSet(E fromElement,
E toElement);
SortedSet tailSet(E fromElement);
}
Слайд 16 Интерфейс Set и SortedSet
Интерфейс Set из пакета java.util, расширяющий интерфейс Collection,
описывает неупорядоченную коллекцию, не содержащую повторяющихся элементов. Это соответствует математическому
понятию множества (set) . Новые методы в интерфейс Set не добавлены, просто метод add() не станет добавлять еще одну копию элемента, если такой элемент уже есть в множестве.
Интерфейс SortedSet расширяющий интерфейс Set, описывает упорядоченное множество, отсортированное по естественному порядку возрастания его элементов или по порядку, заданному реализацией интерфейса Comparator. Элементы не нумеруются, но есть понятие первого, последнего, большего и меньшего элемента. Доп-е методы интерфейса отражают эти понятия:
Comparator comparator () — возвращает способ упорядочения коллекции;
object first ()— возвращает первый, меньший элемент коллекции;
SortedSet headset (Object toEiement) — возвращает начальные, меньшие элементы до элемента toElement исключительно;
object last () — возвращает последний, больший элемент коллекции;
SortedSet subset(Object fromElement, Object toEiement) — возвращает подмножество коллекции от элемента fromElement включительно до элемента toElement исключительно;
SortedSet tailSet (Object fromElement) — возвращает последние, большие элементы коллекции от элементаf romElement включительно.
Платформа Java содержит три класса реализации интерофейса Set: HashSet, TreeSet и LinkedHashSet.
Слайд 17 Классы HashSet, TreeSet, LinkedHashSet
Конструкторы класса HashSet :
HashSet()
HashSet(int capacity)
HashSet(int capacity, float
loadFactor)
HashSet(Collection c)
Конструкторы класса TreeSet :
TreeSet ()
TreeSet (Comparator с)
TreeSet (Collection coll)
TreeSet (SortedMap
sf)
Слайд 18 Классы HashSet, TreeSet, LinkedHashSet
Класс HashSet наследуется от абстрактного
суперкласса AbstractSet и реализует интерфейс Set, используя хэш-таблицу для хранения коллекции. Ключ (хэш-код)
используется вместо индекса для доступа к данным, что значительно ускоряет поиск определенного элемента.
В классе HashSet четыре конструктора:
Hashset () — создает пустой объект с показателем загруженности 0,75;
HashSet (int capacity) — создает пустой объект с начальной емкостью capacity и показателем загруженности 0,75;
HashSet (int capacity, float loadFactor) — создает пустой объект с начальной емкостью capacity и показателем загруженности loadFactor ;
HashSet (Collection coll) — создает объект, содержащий все элементы коллекции coll , с емкостью, равной удвоенному числу элементов коллекции coll , но не менее 11, и показателем загруженности 0,75.
Класс TreeSet реализован как бинарное дерево поиска, значит, его элементы хранятся в упорядоченном виде. Это значительно ускоряет поиск нужного элемента. Обработка операций удаления и вставки объектов происходит медленнее, чем в хэш-множествах, но быстрее, чем в списках. Класс TreeSet полностью реализует интерфейс SortedSet
В классе TreeSet четыре конструктора:
TreeSet () — создает пустой объект с естественным порядком элементов;
TreeSet (Comparator с) — создает пустой объект, в котором порядок зад-ся объектом сравнения с;
TreeSet (Collection coll) — создает объект, содержащий все элементы коллекции coll , с естественным порядком ее элементов;
TreeSet (SortedMap sf) — создает объект, содержащий все эл-ты отображения sf , в том же порядке.
TreeSet коллекция которая позволяет хранить объекты в отсортированном виде. Для собственных классов необходимо реализовать интерфейс Comparable или Comparator, в противном случае, при добавлении второго элемента вы получите ошибку: cannot be cast to java.lang.Comparable
Слайд 19 Классы HashSet, TreeSet, LinkedHashSet
LinkedHashSet - упорядоченная версия
HashSet, которая обслуживает дважды связанный список и его элементы. Следует
использовать данный класс вместо HashSet, когда Вам важен порядок итерации. Когда вы проходите через HashSet - порядок непредсказуем, в то время как LinkedHashSet позволяет Вам проходить через элементы в том порядке, в котором они были вставлены.
Слайд 20 Интерфейс Set и классы HashSet, TreeSet, LinkedHashSet
Слайд 21 Интерфейс Set и классы HashSet, TreeSet, LinkedHashSet
Не смотря на то, что все три рассматриваемые коллекции реализуют
один тот же интерфейс, они отличаются друг от друга. Главное различие — это порядок хранения элементов. HashSet хранит элементы в случайном (на первый взгляд) порядке. Дело в том, что для быстрого поиска HashSet расчитывает для каждлого элемента hashCode и именно по этому ключу ищет и упорядочивает элементы внутри себя. TreeSet, в отличии от HashSet, хранит элементы упорядоченно, то есть в каком бы порядке мы не добавляли и не удаляли элементы, коллекция останется строго упорядоченной. LinkedHashSet используется в том случае, если нам необходимо помнить порядок добавления элементов. Поиск по этой коллекции происходит также по hashCode, но порядок будет всегда совпадать с очерёдностью добавления.
В конструкторе класса SetsSamples создаются объекты наших коллекции и вызывается метод fillSets, который и добавит count случайных чисел в только что созданные объекты. В этом методе мы используем класс Random (который, кстати, также содержится в пакете java.utils). Этот класс используется для получения последовательностей случайных чисел. В этом примере мы используем только один из его методов — это nextInt. Данный метод каждый раз будет возвращать случайное число в пределах от 0 до переданного параметром значения.
Для каждой коллекции вызываются методы toString() и size(). Метод toString() возвращает строку, содержащую элементы коллекции, перечисленные через запятую. Список справа и слева ограничивается квадратными скобками «[" и "]» (например [1, 2, 5]). size() возвращает количество элементов в коллекции.
Метод removeMax удаляет максимальный элемент из коллекции treeSet. Так, как TreeSet хранит элементы упорядоченно, метод last() (возвращает последний элемент коллекции) вернёт нам наибольший элемент. С помощью метода remove мы удалим этот элемент из коллекции.
У нас есть возможность создавать коллекцию, сразу добавляя в неё элементы из другой. Этим и воспользуемся в методе create для копирования коллекции.
removeAll удалит все элементы linkedHashSet из hashSet.
retainAll — наоборот, оставит в hashSet все элементы, которые есть в linkedHashSet
Слайд 22 Интерфейс Set и классы HashSet, TreeSet, LinkedHashSet
Слайд 23 Интерфейс Set и классы HashSet, TreeSet, LinkedHashSet
Слайд 24 Интерфейс Set и класс TreeSet
Пример .
Слайд 25 Интерфейс Set и класс TreeSet
Пример .