Top.Mail.Ru

Перечень уроков по Java

32. Интерфейс Set, класс HashSet

Реализация интерфейса Set представляет собой неупорядоченную коллекцию, которая не может содержать дублирующие данные.

Интерфейс Set включает следующие методы:

  • boolean add (E item): Добавление элемента в коллекцию, если он отсутствует. Возвращает true, если элемент добавлен.
  • boolean addAll (Collection<?> c): Добавление элементов коллекции, если они отсутствуют
  • void clear (): удаляет все элементы из коллекции
  • boolean contains (Object item): возвращает true, если объект item содержится в коллекции, иначе возвращает false
  • boolean containsAll (Collection<?> c): возвращает true, если указанная коллекция содержится в этой коллекции, иначе возвращает false
  • equals(Object item )  Проверка на равенство.
  • hashCode() Получение hashCode набора.
  • boolean retainAll(Collection<?>c) удаление из этой коллекции всех элементов  указанной коллекции с
  • boolean isEmpty (): возвращает true, если коллекция пуста, иначе возвращает false
  • boolean remove (Object item): возвращает true, если объект item удачно удален из коллекции, иначе возвращается false
  • int size (): возвращает число элементов в коллекции
  • Object[] toArray (): возвращает массив, содержащий все элементы коллекции
  • Iterator<E> iterator(): возвращает итератор коллекции

Класс HashSet

интерфейс Set
       |
       +------- HashSet
       |
       +------- TreeSet

 В классе HashSet порядок элементов оптимизирован для быстрого поиска. В классе TreeSet объекты отсортированы по возрастанию.

 

Класс HashSet<E> представляет хеш-таблицу - структуру  данных, в которой все объекты имеют уникальный ключ или хеш-код. Данный ключ позволяет уникально идентифицировать объект в таблице.

Имеются следующие конструкторы:

  • HashSet(): создает пустой список
  • HashSet(Collection<? extends E> c): создает хеш-таблицу, в которую добавляет все элементы коллекции c
  • HashSet(int capacity): параметр capacity указывает начальную емкость таблицы, которая по умолчанию равна 16
  • HashSet(int capacity, float k): k - коэффициент заполнения, значение которого должно быть в пределах от 0.0 до 1.0, указывает, насколько должна быть заполнена емкость объектами прежде чем произойдет ее расширение. Например, коэффициент 0.75 указывает, что при заполнении емкости на 3/4 произойдет ее расширение.

Класс HashSet не добавляет новых методов, реализуя лишь те, что объявлены в родительских классах и применяемых интерфейсах.

 

Пример работы с классом HashSet.

public static void main(String args[]) {

        // Создание множества (набора) set

        Set set1 = new HashSet();

        // Добаление элемениов в множество

        set1.add("Айва");

        set1.add("Абрикос");

        set1.add("Слива");

        set1.add("Абрикос");//Дублирование! Запись не попадет в множество

        set1.add("Персик");

        set1.add("Груша");

        set1.add("Вишня");

     

        // Вывод элементов множества

        System.out.println("set1: " + set1);

        // Создание ArrayList - списка  и добавление элементов

        List list = new ArrayList();

        list.add("Айва");

        list.add("Абрикос");

        list.add("Слива");

        list.add("Абрикос");

        list.add("Персик");

        list.add("Груша");

        list.add("Вишня");

        list.add("Груша");

        list.add("Вишня");

       

        // Создание множество  mySet2 с помощью конструктора

        Set set2 = new HashSet(list);

        // Вывод элементов списка

        System.out.println("list: " + list);

        // Вывод элементов множества

        System.out.println("set2: " + set2);

        // Сравнение двух множеств

        System.out.println("set1 сравним с set2: " + set1.equals(set2));

        // Удаление элемента "Айва" из множества

        set2.remove("Айва");

        // Вывод элементов множества set2

        System.out.println("set2: " + set2);

        // Сравнение двух множеств

        System.out.println("set1 сравним с set2: " + set1.equals(set2));

        // Проверка: множества содержат все элементы списка?

        System.out.println("set1 содержит все элементы списка: " + set1.containsAll(list));

        System.out.println("set2 содержит все элементы списка: " + set2.containsAll(list));

       

        // Извлечение элементов множества через итератор

        // hasNext(): возвращает  true, если есть следующий элемент

        // next(): следующий элемент

        // создание итератора

        Iterator iterator = set1.iterator();

        System.out.println("Извлечение элементов через итератор");

        while (iterator.hasNext()) {

            System.out.println("элемент: " + iterator.next());

        }

      

        // Вывод содержимого списка через  foreach цикл

        System.out.println("Извлечение элементов списка с использованием foreach цикла");

        for (Object str : set1) {

            System.out.println("элемент: " + str);

        }

        // Удалить все элементы из множества

        set1.clear();

        // Проверка, множество пустое?

        System.out.println("set1 is Empty: " + set1.isEmpty());

        // Количество элементов множества

        System.out.println("Set1 содержит: " + set1.size() + " элементов");

        System.out.println("set2 содержит: " + set2.size() + " элементов");

        // / Перевод множества в  массив

        String[] array = (String[]) set2.toArray(new String[set2.size()]);

        System.out.println("Массив создан из множества:" + Arrays.toString(array));

    }

Будет выведено:

set1: [Вишня, Груша, Слива, Персик, Абрикос, Айва]
list: [Айва, Абрикос, Слива, Абрикос, Персик, Груша, Вишня, Груша, Вишня]
set2: [Вишня, Груша, Слива, Персик, Абрикос, Айва]
set1 сравним с set2: true
set2: [Вишня, Груша, Слива, Персик, Абрикос]
set1 сравним с set2: false
set1 содержит все элементы списка: true
set2 содержит все элементы списка: false
Извлечение элементов через итератор
элемент: Вишня
элемент: Груша
элемент: Слива
элемент: Персик
элемент: Абрикос
элемент: Айва
Извлечение элементов списка с использованием foreach цикла
элемент: Вишня
элемент: Груша
элемент: Слива
элемент: Персик
элемент: Абрикос
элемент: Айва
set1 is Empty: true
Set1 содержит: 0 элементов
set2 содержит: 5 элементов
Массив создан из множества:[Вишня, Груша, Слива, Персик, Абрикос]