Вводный курс. Язык программирования Java
- Вводный курс. Язык программирования Java
- Просмотров: 3900
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 элементов
Массив создан из множества:[Вишня, Груша, Слива, Персик, Абрикос]