Введение в программирование

Коллекции

Collections Framework

  • Набор контейнеров
    • Интерфейсы
    • Реализации
    • Алгоритмы
  • Пакет java.util

Контейнеры

Содержание

Коллекции

Содержание

Коллекции

  • Коллекция ─ неупорядоченный набор элементов
  • Интерфейс Collection<E>
    • <E> ─ тип элемента

Немодифицирующие операции

  • Определение размера
    • size() ─ количество элементов
    • isEmpty() ─ проверка на пустоту
  • Проверки на вхождение

Модифицирующие операции

Итераторы

Интерфейс итератора

Применение итераторов

  • Обход коллекции
    for (Iterator<E> i = c.iterator(); i.hasNext(); ) {
        final E element = i.next();
        ...
    }
    
  • Фильтрация коллекции
    for (Iterator<E> i = c.iterator(); i.hasNext(); ) {
        if (!p(i.next()) {
            i.remove();
        }
    }
    

Интерфейс Iterable

  • Расширенный for
  • Код
    • for (T element : collection) {
          ...
      }
      
  • Эквивалентен
    • for (Iterator<T> i = collection.iterator(); i.hasNext(); ) {
          T element = i.next();
          ...
      }
      

Пример. Вывод коллекции на экран

  • public void dump(Collection<String> c) {
        for (Iterator<String> i = c.iterator(); i.hasNext(); ) {
            final String word = i.next();
            System.out.print(word + ", ");
        }
        System.out.println();
    }
    

Преобразование в массив

  • Методы
    • Object[] toArray() ─ массив объектов
    • T[] toArray(t[]) ─ типизированный массив
  • Пример использования
    String[] lines = c.toArray(new String[c.size()]);
    
  • В каком порядке идут элементы?
    • В порядке обхода итератором

Множества

Содержание

Множества

  • Множество ─ коллекция без повторяющихся элементов
  • Интерфейс Set<E> extends Collection<E>

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

Классы HashSet и LinkedHashSet

Пример. Поиск уникальных слов

  • Set<String> words = new HashSet<String>();
    int total = read(args[0], words);
    System.out.println("Words total: " + total);
    System.out.println("Unique words: " +
        words.size());
    dump(words);
    

Неизменяемые множества (9+)

Списки

Содержание

Списки

  • Список ─ коллекция с индексированными элементами
  • Интерфейс List<E> extends Collection<E>

Операции со списками

Подсписки (виды)

  • l.delete(2) либо sl.delete(1)
  • l.add(1, X) либо sl.add(0, X)

Итератор по списку

Операции итератора по списку

Класс ArrayList

Применение ArrayList

  • Плюсы
    • Быстрый доступ по индексу
    • Быстрая вставка и удаление элементов с конца
  • Минусы
    • Медленная вставка и удаление элементов
  • Примеры
    • Замена массива
    • “Бесконечный” массив
    • Стек

Пример. Вывод ArrayList на экран

  • List<E> list = new ArrayList<E>();
    …
    for (int i = list.size() - 1; i >= 0; i--) {
        System.out.println(list.get(i));
    }
    

Класс LinkedList

Применение LinkedList

  • Плюсы
    • Быстрое добавление и удаление элементов
  • Минусы
    • Медленный доступ по индексу
    • Большое потребление памяти
  • Примеры
    • Стек
    • Очередь
    • Дек

Пример. Вывод LinkedList на экран

  • List<E> list = new LinkedList<E>();
    …
    for (ListIterator<E> li = list.listIterator(list.size());
        li.hasPrevious(); )
    {
        System.out.println(li.previous());
    }
    

Неизменяемые списки (9+)

Очереди и деки

Содержание

Очередь

  • Очередь – хранилище элементов для обработки
  • Интерфейс Queue<E> extends Collection<E>
  • Свойства очередей
    • Не могут хранить null
    • Различные порядки элементов
    • Может быть ограничен размер
    • Могу не принять элемент

Методы очередей

Класс LinkedList

  • Очередь на двусвязном списке

Класс AbstractQueue

  • Позволяет быстро реализовывать очереди
  • Методы
  • Почему методы без исключений?
    • Исключение не дешёвая операция

Деки

Отображения

Содержание

Отображение

  • Отображение ─ множество пар ключ-значение при уникальности ключа
  • Интерфейс Map<K, V>

Методы отображений (1)

Методы отображений (2)

Пары

Классы HashMap и LinkedHashMap

Пример. Подсчет слов в тексте (1)

  • Map<String, Integer> map
        = new HashMap<String, Integer>();
    while (scanner.hasNext()) {
        String word = scanner.next();
        Integer count = map.get(word);
        map.put(word, count == null ? 1 : count + 1));
    }
    

Пример. Подсчет слов в тексте (2)

  • for (
        Map.Entry<String, Integer> entry :
            map.entrySet()
    ) {
        System.out.println(
             entry.getKey() + " " + entry.getValue());
    }
    

Неизменяемые отображения (9+)

Упорядоченные коллекции

Содержание

Сравнение элементов

Сравнение элементов (контракт)

  • Транзитивность
  • Антисимметричность
    • sgn(x.compareTo(y))) == -sgn(y.compareTo(x))
  • Согласованность с равенством
    • x.compareTo(y) == 0sgn(x.compareTo(z))==sgn(y.compareTo(z))
  • Согласованность с equals(object)
    • x.equals(y) == (x.compareTo(y) == 0)

Упорядоченные множества (1)

Упорядоченные множества (2)

Упорядоченные отображения (1)

Упорядоченные отображения (2)

Класс PriorityQueue

  • Очередь с приоритетами
    • Минимальны элемент
    • На двоичной куче

Пример. Применение TreeSet

  • Естественный порядок
    SortedSet<T> words = new TreeSet<String>();
    read(args[0], words);
    dump(words);
    
  • Порядок без учета регистра
    SortedSet<T> words = new TreeSet<String>(
        String.CASE_INSENSITIVE_ORDER);
    read(args[0], words);
    dump(words);
    

Алгоритмы

Содержание

Алгоритмы на коллекциях

Содержание

Класс Collections

  • Алгоритмы для работы с коллекциями
    • Простые операции
    • Сортировка
    • Двоичный поиск
    • Поиск минимума и максимума
  • Специальные коллекции
  • Оболочки коллекций

Простые операции

Сортировки

Двоичный поиск

  • Осуществляет двоичный поиск в списке
    • Найден – индекс элемента
    • Не найден – –1 – индекс места вставки
  • Методы

Поиск минимума и максимума

Пример. Алгоритмы на списках

  • List<String> list = new ArrayList<String>();
    read(args[0], list);
    Collections.reverse(list);
    Collections.shuffle(list);
    Collections.sort(list);
    Collections.sort(list,
        String.CASE_INSENSITIVE_ORDER);
    Collections.fill(list, "temp");
    System.out.println(Collections.min(list));
    System.out.println(Collections.min(list,
        String.CASE_INSENSITIVE_ORDER));
    

Специальные коллекции

Оболочки коллекций

Алгоритмы на массивах

Содержание

Класс Arrays

  • Операции с массивами
    • Сортировка
    • Двоичный поиск
    • Поиск минимума и максимума
    • Заполнение
    • Преобразование в строку
    • ...
  • Вид массива как списка

Заключение

Содержание

Структура Collections Framework (1)

Структура Collections Framework (2)

Ссылки

Вопросы

???