Как проверить, содержит ли одно множество все элементы другого множества в Java

JavaJavaBeginner
Практиковаться сейчас

💡 Этот учебник переведен с английского с помощью ИИ. Чтобы просмотреть оригинал, вы можете перейти на английский оригинал

Введение

В этом практическом занятии (лабораторной работе) вы узнаете, как проверить, содержит ли один набор (множество) все элементы другого набора (множества) на Java. Мы рассмотрим метод containsAll(), который представляет собой удобный способ для выполнения такой проверки на подмножество.

С помощью практических примеров вы научитесь использовать метод containsAll() с разными типами наборов (множеств) и как обрабатывать крайние случаи, такие как пустые и нулевые (null) наборы (множества).


Skills Graph

%%%%{init: {'theme':'neutral'}}%%%% flowchart RL java(("Java")) -.-> java/DataStructuresGroup(["Data Structures"]) java(("Java")) -.-> java/ObjectOrientedandAdvancedConceptsGroup(["Object-Oriented and Advanced Concepts"]) java/DataStructuresGroup -.-> java/arrays_methods("Arrays Methods") java/DataStructuresGroup -.-> java/collections_methods("Collections Methods") java/ObjectOrientedandAdvancedConceptsGroup -.-> java/exceptions("Exceptions") java/ObjectOrientedandAdvancedConceptsGroup -.-> java/linkedlist("LinkedList") java/ObjectOrientedandAdvancedConceptsGroup -.-> java/hashset("HashSet") subgraph Lab Skills java/arrays_methods -.-> lab-559974{{"Как проверить, содержит ли одно множество все элементы другого множества в Java"}} java/collections_methods -.-> lab-559974{{"Как проверить, содержит ли одно множество все элементы другого множества в Java"}} java/exceptions -.-> lab-559974{{"Как проверить, содержит ли одно множество все элементы другого множества в Java"}} java/linkedlist -.-> lab-559974{{"Как проверить, содержит ли одно множество все элементы другого множества в Java"}} java/hashset -.-> lab-559974{{"Как проверить, содержит ли одно множество все элементы другого множества в Java"}} end

Использование метода 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. Наконец, мы рассмотрели важные аспекты работы с пустыми и нулевыми множествами при проверке подмножеств, чтобы обеспечить надежность и отсутствие ошибок в коде.