Введение
В этом практическом занятии (лабораторной работе) вы узнаете, как проверить, содержит ли один набор (множество) все элементы другого набора (множества) на Java. Мы рассмотрим метод containsAll(), который представляет собой удобный способ для выполнения такой проверки на подмножество.
С помощью практических примеров вы научитесь использовать метод containsAll() с разными типами наборов (множеств) и как обрабатывать крайние случаи, такие как пустые и нулевые (null) наборы (множества).
Использование метода containsAll() для проверки подмножества
На этом этапе мы рассмотрим, как проверить, является ли одно множество подмножеством другого, используя метод containsAll() в Java. Это распространенная операция при работе с коллекциями, и метод containsAll() предоставляет удобный способ для выполнения такой проверки.
Сначала создадим новый Java-файл с именем SubsetCheck.java в директории ~/project. Для этого можно щелкнуть правой кнопкой мыши в проводнике файлов слева и выбрать "New File", а затем ввести SubsetCheck.java.
Теперь откройте файл SubsetCheck.java в редакторе и добавьте следующий код:
import java.util.HashSet;
import java.util.Set;
public class SubsetCheck {
public static void main(String[] args) {
// Create the main set
Set<Integer> mainSet = new HashSet<>();
mainSet.add(1);
mainSet.add(2);
mainSet.add(3);
mainSet.add(4);
mainSet.add(5);
// Create a potential subset
Set<Integer> subset = new HashSet<>();
subset.add(2);
subset.add(4);
// Check if 'subset' is a subset of 'mainSet'
boolean isSubset = mainSet.containsAll(subset);
// Print the result
System.out.println("Main Set: " + mainSet);
System.out.println("Subset: " + subset);
System.out.println("Is 'subset' a subset of 'mainSet'? " + isSubset);
}
}
Разберем этот код по частям:
import java.util.HashSet;иimport java.util.Set;: Эти строки импортируют необходимые классы для работы с множествами.Set<Integer> mainSet = new HashSet<>();: Эта строка создаетHashSetс именемmainSet, который будет хранить целочисленные значения.mainSet.add(...): Эти строки добавляют элементы вmainSet.Set<Integer> subset = new HashSet<>();: Эта строка создает другойHashSetс именемsubset.subset.add(...): Эти строки добавляют элементы вsubset.boolean isSubset = mainSet.containsAll(subset);: Это основная часть этого этапа. МетодcontainsAll()объектаmainSetвызывается с аргументомsubset. Он возвращаетtrue, еслиmainSetсодержит все элементыsubset, иfalseв противном случае.System.out.println(...): Эти строки выводят множества и результат проверки на подмножество в консоль.
Сохраните файл SubsetCheck.java (Ctrl+S или Cmd+S).
Теперь откройте терминал внизу WebIDE. Убедитесь, что вы находитесь в директории ~/project. Если нет, используйте команду cd ~/project.
Скомпилируйте Java-код с помощью команды javac:
javac SubsetCheck.java
Если нет ошибок, вы не должны увидеть никакого вывода. Это означает, что компиляция прошла успешно, и был создан файл SubsetCheck.class.
Наконец, запустите скомпилированную Java-программу с помощью команды java:
java SubsetCheck
Вы должны увидеть вывод, похожий на следующий:
Main Set: [1, 2, 3, 4, 5]
Subset: [2, 4]
Is 'subset' a subset of 'mainSet'? true
Этот вывод подтверждает, что метод containsAll() правильно определил, что subset действительно является подмножеством mainSet.
Тестирование с разными типами множеств
На предыдущем этапе мы использовали HashSet для демонстрации метода containsAll(). Java предоставляет различные реализации интерфейса Set, такие как HashSet, LinkedHashSet и TreeSet. Хотя они имеют разные внутренние структуры и свойства (например, порядок элементов), метод containsAll() работает одинаково для всех них.
На этом этапе мы изменим файл SubsetCheck.java, чтобы протестировать метод containsAll() с разными типами множеств.
Откройте файл SubsetCheck.java в редакторе WebIDE.
Замените существующий код следующим:
import java.util.HashSet;
import java.util.LinkedHashSet;
import java.util.Set;
import java.util.TreeSet;
public class SubsetCheck {
public static void main(String[] args) {
// Create a main set using HashSet
Set<Integer> hashMainSet = new HashSet<>();
hashMainSet.add(10);
hashMainSet.add(20);
hashMainSet.add(30);
hashMainSet.add(40);
// Create a subset using LinkedHashSet
Set<Integer> linkedSubset = new LinkedHashSet<>();
linkedSubset.add(30);
linkedSubset.add(10);
// Create another subset using TreeSet
Set<Integer> treeSubset = new TreeSet<>();
treeSubset.add(40);
treeSubset.add(20);
// Check subset relationship using containsAll()
boolean isLinkedSubset = hashMainSet.containsAll(linkedSubset);
boolean isTreeSubset = hashMainSet.containsAll(treeSubset);
// Create a subset that is NOT a subset
Set<Integer> notSubset = new HashSet<>();
notSubset.add(20);
notSubset.add(50); // 50 is not in hashMainSet
boolean isNotSubset = hashMainSet.containsAll(notSubset);
// Print the results
System.out.println("Hash Main Set: " + hashMainSet);
System.out.println("Linked Subset: " + linkedSubset);
System.out.println("Is Linked Subset a subset of Hash Main Set? " + isLinkedSubset);
System.out.println("Tree Subset: " + treeSubset);
System.out.println("Is Tree Subset a subset of Hash Main Set? " + isTreeSubset);
System.out.println("Not Subset: " + notSubset);
System.out.println("Is Not Subset a subset of Hash Main Set? " + isNotSubset);
}
}
В этом обновленном коде:
- Мы импортировали
LinkedHashSetиTreeSet. - Мы создали
hashMainSetс использованиемHashSet. - Мы создали
linkedSubsetс использованиемLinkedHashSetиtreeSubsetс использованиемTreeSet. Обратите внимание, что порядок добавления элементов вlinkedSubsetотличается от порядка их появления вhashMainSet, но методcontainsAll()все равно работает корректно.TreeSetавтоматически сортирует элементы. - Мы также добавили
notSubset, чтобы продемонстрировать случай, когда методcontainsAll()возвращаетfalse.
Сохраните файл SubsetCheck.java.
Теперь скомпилируйте измененный код в терминале:
javac SubsetCheck.java
Если компиляция прошла успешно, запустите программу:
java SubsetCheck
Вы должны увидеть вывод, похожий на следующий:
Hash Main Set: [40, 10, 20, 30]
Linked Subset: [30, 10]
Is Linked Subset a subset of Hash Main Set? true
Tree Subset: [20, 40]
Is Tree Subset a subset of Hash Main Set? true
Not Subset: [50, 20]
Is Not Subset a subset of Hash Main Set? false
Это демонстрирует, что метод containsAll() работает корректно независимо от конкретной реализации Set, используемой для подмножества, при условии, что основное множество содержит все элементы подмножества.
Обработка пустых и нулевых множеств
На этом последнем этапе мы рассмотрим, как метод containsAll() ведет себя при работе с пустыми множествами и нулевыми значениями. Понимание этих крайних случаев важно для написания надежного кода.
Откройте файл SubsetCheck.java в редакторе WebIDE.
Замените существующий код следующим:
import java.util.HashSet;
import java.util.Set;
public class SubsetCheck {
public static void main(String[] args) {
Set<Integer> mainSet = new HashSet<>();
mainSet.add(1);
mainSet.add(2);
mainSet.add(3);
// Case 1: Checking with an empty set
Set<Integer> emptySet = new HashSet<>();
boolean isEmptySubset = mainSet.containsAll(emptySet);
System.out.println("Main Set: " + mainSet);
System.out.println("Empty Set: " + emptySet);
System.out.println("Is Empty Set a subset of Main Set? " + isEmptySubset);
System.out.println("---"); // Separator
// Case 2: Checking if an empty set contains all elements of a non-empty set
Set<Integer> anotherEmptySet = new HashSet<>();
Set<Integer> nonEmptySet = new HashSet<>();
nonEmptySet.add(1);
boolean isEmptyContainingNonEmpty = anotherEmptySet.containsAll(nonEmptySet);
System.out.println("Another Empty Set: " + anotherEmptySet);
System.out.println("Non-Empty Set: " + nonEmptySet);
System.out.println("Is Another Empty Set a subset of Non-Empty Set? " + isEmptyContainingNonEmpty);
System.out.println("---"); // Separator
// Case 3: Checking with a null set
Set<Integer> nullSet = null;
try {
boolean isNullSubset = mainSet.containsAll(nullSet);
System.out.println("Is Null Set a subset of Main Set? " + isNullSubset);
} catch (NullPointerException e) {
System.out.println("Checking with a null set resulted in a: " + e.getClass().getName());
}
}
}
Рассмотрим новые части кода:
- Случай 1: Проверка с пустым множеством: Мы создаем
emptySetи проверяем, содержит лиmainSetвсе его элементы. Пустое множество считается подмножеством любого множества, включая другое пустое множество. - Случай 2: Проверка, содержит ли пустое множество все элементы непустого множества: Мы проверяем, содержит ли
anotherEmptySetвсе элементыnonEmptySet. Это должно быть ложно, так как пустое множество не содержит элемент1. - Случай 3: Проверка с нулевым множеством: Мы присваиваем переменной типа
Setзначениеnull. Попытка вызватьcontainsAll()с аргументомnullприведет кNullPointerException. Мы используем блокtry-catch, чтобыGracefully обработать это ожидаемое исключение и вывести сообщение.
Сохраните файл SubsetCheck.java.
Скомпилируйте код в терминале:
javac SubsetCheck.java
Запустите скомпилированную программу:
java SubsetCheck
Вы должны увидеть вывод, похожий на следующий:
Main Set: [1, 2, 3]
Empty Set: []
Is Empty Set a subset of Main Set? true
---
Another Empty Set: []
Non-Empty Set: [1]
Is Another Empty Set a subset of Non-Empty Set? false
---
Checking with a null set resulted in a: java.lang.NullPointerException
Этот вывод подтверждает поведение метода containsAll() с пустыми и нулевыми множествами:
- Пустое множество всегда является подмножеством другого множества (
true). - Непустое множество никогда не является подмножеством пустого множества (
false). - Передача
nullв методcontainsAll()приводит кNullPointerException.
Понимание этих случаев помогает избежать потенциальных ошибок при работе с множествами в Java.
Резюме
В этом практическом занятии (лабораторной работе) мы научились проверять, содержит ли одно множество все элементы другого множества в Java с использованием метода containsAll(). Мы начали с создания простого примера с использованием HashSet, чтобы продемонстрировать основную функциональность метода containsAll(). Этот метод предоставляет простой способ определить, действительно ли потенциальное подмножество содержится в большем множестве.
Затем мы исследовали, как протестировать эту функциональность с разными типами множеств, поняв, что метод containsAll() работает одинаково для различных реализаций интерфейса Set. Наконец, мы рассмотрели важные аспекты работы с пустыми и нулевыми множествами при проверке подмножеств, чтобы обеспечить надежность и отсутствие ошибок в коде.



