So prüfen Sie, ob eine Liste alle Elemente einer anderen Liste in Java enthält

JavaJavaBeginner
Jetzt üben

💡 Dieser Artikel wurde von AI-Assistenten übersetzt. Um die englische Version anzuzeigen, können Sie hier klicken

Einführung

In diesem Lab lernen Sie, wie Sie in Java prüfen können, ob eine Liste alle Elemente einer anderen Liste enthält. Dies ist eine grundlegende Aufgabe, wenn Sie mit Sammlungen (Collections) arbeiten und die Beziehungen zwischen Datensätzen verstehen möchten.

Wir werden die effiziente containsAll()-Methode erkunden, die von der Java Collections-Framework bereitgestellt wird, um schnell zu überprüfen, ob eine Liste eine Teilmenge einer anderen ist. Um Ihr Verständnis zu festigen, lernen Sie auch, wie Sie diese Prüfung manuell mit einer Schleife durchführen können. Abschließend werden wir das Verhalten dieser Methoden mit Randfällen testen, einschließlich leerer und null-Listen, um sicherzustellen, dass der Code robust ist.


Skills Graph

%%%%{init: {'theme':'neutral'}}%%%% flowchart RL java(("Java")) -.-> java/BasicSyntaxGroup(["Basic Syntax"]) java(("Java")) -.-> java/DataStructuresGroup(["Data Structures"]) java(("Java")) -.-> java/ObjectOrientedandAdvancedConceptsGroup(["Object-Oriented and Advanced Concepts"]) java/BasicSyntaxGroup -.-> java/for_loop("For Loop") java/DataStructuresGroup -.-> java/arrays_methods("Arrays Methods") java/DataStructuresGroup -.-> java/collections_methods("Collections Methods") java/ObjectOrientedandAdvancedConceptsGroup -.-> java/classes_objects("Classes/Objects") java/ObjectOrientedandAdvancedConceptsGroup -.-> java/arraylist("ArrayList") subgraph Lab Skills java/for_loop -.-> lab-559946{{"So prüfen Sie, ob eine Liste alle Elemente einer anderen Liste in Java enthält"}} java/arrays_methods -.-> lab-559946{{"So prüfen Sie, ob eine Liste alle Elemente einer anderen Liste in Java enthält"}} java/collections_methods -.-> lab-559946{{"So prüfen Sie, ob eine Liste alle Elemente einer anderen Liste in Java enthält"}} java/classes_objects -.-> lab-559946{{"So prüfen Sie, ob eine Liste alle Elemente einer anderen Liste in Java enthält"}} java/arraylist -.-> lab-559946{{"So prüfen Sie, ob eine Liste alle Elemente einer anderen Liste in Java enthält"}} end

Verwendung von containsAll() für die Teilmengengeprüfung

In diesem Schritt werden wir untersuchen, wie man in Java prüft, ob eine Liste eine Teilmenge einer anderen Liste ist, indem man die containsAll()-Methode verwendet. Dies ist eine häufige Aufgabe, wenn man mit Sammlungen (Collections) arbeitet, und containsAll() bietet eine bequeme Möglichkeit, diese Prüfung durchzuführen.

Zunächst erstellen wir eine neue Java-Datei namens SubsetCheck.java in Ihrem ~/project-Verzeichnis. Sie können dies über den Dateiexplorer der WebIDE auf der linken Seite tun. Klicken Sie mit der rechten Maustaste im ~/project-Bereich, wählen Sie "Neue Datei" und geben Sie SubsetCheck.java ein.

Öffnen Sie jetzt die Datei SubsetCheck.java im Editor und fügen Sie den folgenden Code hinzu:

import java.util.ArrayList;
import java.util.List;

public class SubsetCheck {

    public static void main(String[] args) {
        // Create the main list
        List<String> mainList = new ArrayList<>();
        mainList.add("Apple");
        mainList.add("Banana");
        mainList.add("Cherry");
        mainList.add("Date");

        // Create a potential subset list
        List<String> subList = new ArrayList<>();
        subList.add("Banana");
        subList.add("Cherry");

        // Check if subList is a subset of mainList using containsAll()
        boolean isSubset = mainList.containsAll(subList);

        // Print the result
        System.out.println("Main List: " + mainList);
        System.out.println("Sub List: " + subList);
        System.out.println("Is subList a subset of mainList? " + isSubset);

        // Create another list that is not a subset
        List<String> anotherList = new ArrayList<>();
        anotherList.add("Banana");
        anotherList.add("Grape"); // Grape is not in mainList

        // Check if anotherList is a subset of mainList
        boolean isAnotherSubset = mainList.containsAll(anotherList);

        // Print the result for the second check
        System.out.println("\nAnother List: " + anotherList);
        System.out.println("Is anotherList a subset of mainList? " + isAnotherSubset);
    }
}

Lassen Sie uns den Code analysieren:

  • Wir importieren ArrayList und List aus dem java.util-Paket, um mit Listen zu arbeiten.
  • Wir erstellen zwei ArrayList-Objekte: mainList und subList.
  • Wir fügen einige Zeichenkettenelemente zu beiden Listen hinzu.
  • Der Schlüsselteil ist mainList.containsAll(subList). Diese Methode prüft, ob mainList alle Elemente enthält, die in subList vorhanden sind. Sie gibt true zurück, wenn dies der Fall ist, und false sonst.
  • Wir speichern das Ergebnis in einer booleschen Variablen isSubset und geben es aus.
  • Dann erstellen wir anotherList, die ein Element enthält, das nicht in mainList vorhanden ist, und führen die gleiche Prüfung durch, um das Ergebnis zu sehen, wenn es keine Teilmenge ist.

Speichern Sie die Datei SubsetCheck.java (Strg+S oder Cmd+S).

Öffnen Sie jetzt das Terminal unten in der WebIDE. Stellen Sie sicher, dass Sie sich im ~/project-Verzeichnis befinden. Wenn nicht, verwenden Sie den Befehl cd ~/project.

Kompilieren Sie den Java-Code mit dem javac-Befehl:

javac SubsetCheck.java

Wenn es keine Kompilierungsfehler gibt, sollte in Ihrem ~/project-Verzeichnis eine Datei namens SubsetCheck.class erstellt werden.

Führen Sie schließlich das kompilierte Java-Programm mit dem java-Befehl aus:

java SubsetCheck

Sie sollten eine Ausgabe ähnlich der folgenden sehen:

Main List: [Apple, Banana, Cherry, Date]
Sub List: [Banana, Cherry]
Is subList a subset of mainList? true

Another List: [Banana, Grape]
Is anotherList a subset of mainList? false

Diese Ausgabe bestätigt, dass subList tatsächlich eine Teilmenge von mainList ist, da alle ihre Elemente in mainList vorhanden sind, während anotherList keine Teilmenge ist, da "Grape" nicht in mainList enthalten ist.

Überprüfung mit einer manuellen Schleife

Im vorherigen Schritt haben wir die bequeme containsAll()-Methode verwendet, um zu prüfen, ob eine Liste eine Teilmenge einer anderen ist. Obwohl containsAll() effizient ist, ist es hilfreich, zu verstehen, wie man diese Prüfung manuell mit einer Schleife durchführt. Dies vertieft Ihr Verständnis davon, wie Sammlungsmethoden intern funktionieren könnten.

Fügen wir eine neue Methode zu unserer SubsetCheck.java-Datei hinzu, um die Teilmengengeprüfung manuell durchzuführen. Öffnen Sie ~/project/SubsetCheck.java im WebIDE-Editor.

Fügen Sie die folgende Methode innerhalb der SubsetCheck-Klasse, aber außerhalb der main-Methode hinzu:

    // Method to manually check if subList is a subset of mainList
    public static boolean isSubsetManual(List<String> mainList, List<String> subList) {
        // Iterate through each element in the subList
        for (String element : subList) {
            // If the mainList does NOT contain the current element from subList,
            // then subList is not a subset, and we can return false immediately.
            if (!mainList.contains(element)) {
                return false;
            }
        }
        // If we have checked all elements in subList and found them all in mainList,
        // then subList is a subset.
        return true;
    }

Diese neue Methode isSubsetManual nimmt zwei Listen als Eingabe. Sie durchläuft dann jedes element in der subList. Innerhalb der Schleife prüft sie, ob die mainList das aktuelle element mithilfe der contains()-Methode enthält. Wenn sie auch nur ein Element in subList findet, das nicht in mainList enthalten ist, weiß sie sofort, dass subList keine Teilmenge ist und gibt false zurück. Wenn die Schleife ohne das Finden eines fehlenden Elements in subList beendet wird, bedeutet dies, dass alle Elemente vorhanden sind, und die Methode gibt true zurück.

Rufen wir jetzt diese neue Methode aus unserer main-Methode auf, um ihr Ergebnis mit containsAll() zu vergleichen. Modifizieren Sie die main-Methode in SubsetCheck.java, um Aufrufe von isSubsetManual einzubeziehen:

import java.util.ArrayList;
import java.util.List;

public class SubsetCheck {

    public static void main(String[] args) {
        // Create the main list
        List<String> mainList = new ArrayList<>();
        mainList.add("Apple");
        mainList.add("Banana");
        mainList.add("Cherry");
        mainList.add("Date");

        // Create a potential subset list
        List<String> subList = new ArrayList<>();
        subList.add("Banana");
        subList.add("Cherry");

        // Check if subList is a subset of mainList using containsAll()
        boolean isSubsetContainsAll = mainList.containsAll(subList);
        // Check if subList is a subset of mainList using manual loop
        boolean isSubsetManualCheck = isSubsetManual(mainList, subList);


        // Print the result
        System.out.println("Main List: " + mainList);
        System.out.println("Sub List: " + subList);
        System.out.println("Is subList a subset of mainList (containsAll)? " + isSubsetContainsAll);
        System.out.println("Is subList a subset of mainList (manual check)? " + isSubsetManualCheck);


        // Create another list that is not a subset
        List<String> anotherList = new ArrayList<>();
        anotherList.add("Banana");
        anotherList.add("Grape"); // Grape is not in mainList

        // Check if anotherList is a subset of mainList using containsAll()
        boolean isAnotherSubsetContainsAll = mainList.containsAll(anotherList);
         // Check if anotherList is a subset of mainList using manual loop
        boolean isAnotherSubsetManualCheck = isSubsetManual(mainList, anotherList);


        // Print the result for the second check
        System.out.println("\nAnother List: " + anotherList);
        System.out.println("Is anotherList a subset of mainList (containsAll)? " + isAnotherSubsetContainsAll);
        System.out.println("Is anotherList a subset of mainList (manual check)? " + isAnotherSubsetManualCheck);

    }

    // Method to manually check if subList is a subset of mainList
    public static boolean isSubsetManual(List<String> mainList, List<String> subList) {
        // Iterate through each element in the subList
        for (String element : subList) {
            // If the mainList does NOT contain the current element from subList,
            // then subList is not a subset, and we can return false immediately.
            if (!mainList.contains(element)) {
                return false;
            }
        }
        // If we have checked all elements in subList and found them all in mainList,
        // then subList is a subset.
        return true;
    }
}

Speichern Sie die modifizierte SubsetCheck.java-Datei.

Kompilieren Sie jetzt den aktualisierten Code im Terminal:

javac SubsetCheck.java

Und führen Sie das Programm erneut aus:

java SubsetCheck

Sie sollten eine Ausgabe ähnlich der folgenden sehen, die zeigt, dass sowohl die containsAll()-Methode als auch unsere manuelle Schleifenmethode die gleichen Ergebnisse liefern:

Main List: [Apple, Banana, Cherry, Date]
Sub List: [Banana, Cherry]
Is subList a subset of mainList (containsAll)? true
Is subList a subset of mainList (manual check)? true

Another List: [Banana, Grape]
Is anotherList a subset of mainList (containsAll)? false
Is anotherList a subset of mainList (manual check)? false

Dieser Schritt zeigt, dass Sie dasselbe Ergebnis wie mit containsAll() erzielen können, indem Sie die potenzielle Teilmenge durchlaufen und die Anwesenheit jedes Elements in der Hauptliste prüfen. Obwohl containsAll() aufgrund seiner Kürze und möglicher Leistungsoptimierungen in der Java-Bibliothek im Allgemeinen bevorzugt wird, ist das Verständnis des manuellen Ansatzes für das Lernen von Wert.

Test mit leeren und null-Listen

In diesem Schritt werden wir untersuchen, wie sich die containsAll()-Methode und unsere manuelle Prüfungsmethode verhalten, wenn es um leere Listen und null-Werte geht. Das Verständnis dieser Randfälle ist wichtig für das Schreiben robuster Code.

Öffnen Sie die Datei ~/project/SubsetCheck.java im WebIDE-Editor. Wir werden der main-Methode weitere Testfälle hinzufügen.

Modifizieren Sie die main-Methode, um Prüfungen mit leeren Listen und einer null-Liste einzubeziehen:

import java.util.ArrayList;
import java.util.List;

public class SubsetCheck {

    public static void main(String[] args) {
        // Create the main list
        List<String> mainList = new ArrayList<>();
        mainList.add("Apple");
        mainList.add("Banana");
        mainList.add("Cherry");
        mainList.add("Date");

        // Create a potential subset list
        List<String> subList = new ArrayList<>();
        subList.add("Banana");
        subList.add("Cherry");

        // Check if subList is a subset of mainList using containsAll()
        boolean isSubsetContainsAll = mainList.containsAll(subList);
        // Check if subList is a subset of mainList using manual loop
        boolean isSubsetManualCheck = isSubsetManual(mainList, subList);


        // Print the result
        System.out.println("Main List: " + mainList);
        System.out.println("Sub List: " + subList);
        System.out.println("Is subList a subset of mainList (containsAll)? " + isSubsetContainsAll);
        System.out.println("Is subList a subset of mainList (manual check)? " + isSubsetManualCheck);


        // Create another list that is not a subset
        List<String> anotherList = new ArrayList<>();
        anotherList.add("Banana");
        anotherList.add("Grape"); // Grape is not in mainList

        // Check if anotherList is a subset of mainList using containsAll()
        boolean isAnotherSubsetContainsAll = mainList.containsAll(anotherList);
         // Check if anotherList is a subset of mainList using manual loop
        boolean isAnotherSubsetManualCheck = isSubsetManual(mainList, anotherList);


        // Print the result for the second check
        System.out.println("\nAnother List: " + anotherList);
        System.out.println("Is anotherList a subset of mainList (containsAll)? " + isAnotherSubsetContainsAll);
        System.out.println("Is anotherList a subset of mainList (manual check)? " + isAnotherSubsetManualCheck);

        // --- Test with Empty Lists ---

        // Create an empty list
        List<String> emptyList = new ArrayList<>();

        // Check if emptyList is a subset of mainList
        boolean isEmptySubsetContainsAll = mainList.containsAll(emptyList);
        boolean isEmptySubsetManualCheck = isSubsetManual(mainList, emptyList);

        System.out.println("\nEmpty List: " + emptyList);
        System.out.println("Is emptyList a subset of mainList (containsAll)? " + isEmptySubsetContainsAll);
        System.out.println("Is emptyList a subset of mainList (manual check)? " + isEmptySubsetManualCheck);

        // Check if mainList is a subset of emptyList (should be false unless mainList is also empty)
        boolean isMainSubsetEmptyContainsAll = emptyList.containsAll(mainList);
        boolean isMainSubsetEmptyManualCheck = isSubsetManual(emptyList, mainList);

        System.out.println("Is mainList a subset of emptyList (containsAll)? " + isMainSubsetEmptyContainsAll);
        System.out.println("Is mainList a subset of emptyList (manual check)? " + isMainSubsetEmptyManualCheck);

        // --- Test with Null List ---

        // Create a null list
        List<String> nullList = null;

        // Check with nullList using containsAll()
        System.out.println("\nNull List: " + nullList);
        try {
            boolean isNullSubsetContainsAll = mainList.containsAll(nullList);
            System.out.println("Is nullList a subset of mainList (containsAll)? " + isNullSubsetContainsAll);
        } catch (NullPointerException e) {
            System.out.println("Checking with nullList using containsAll() resulted in: " + e);
        }

        // Check with nullList using manual loop
         try {
            boolean isNullSubsetManualCheck = isSubsetManual(mainList, nullList);
            System.out.println("Is nullList a subset of mainList (manual check)? " + isNullSubsetManualCheck);
        } catch (NullPointerException e) {
            System.out.println("Checking with nullList using manual check resulted in: " + e);
        }
    }

    // Method to manually check if subList is a subset of mainList
    public static boolean isSubsetManual(List<String> mainList, List<String> subList) {
        // Add a check for null subList in the manual method
        if (subList == null) {
             throw new NullPointerException("Sub list cannot be null for manual check.");
        }
        // Iterate through each element in the subList
        for (String element : subList) {
            // If the mainList does NOT contain the current element from subList,
            // then subList is not a subset, and we can return false immediately.
            if (!mainList.contains(element)) {
                return false;
            }
        }
        // If we have checked all elements in subList and found them all in mainList,
        // then subList is a subset.
        return true;
    }
}

Wir haben Abschnitte hinzugefügt, um mit einer emptyList und einer nullList zu testen. Beachten Sie, dass wir für die Tests mit der nullList die Aufrufe in try-catch-Blöcken umschließen. Dies liegt daran, dass der Versuch, Methoden auf einem null-Objekt aufzurufen (wie mainList.containsAll(nullList)), zu einer NullPointerException führt. Unsere manuelle Methode muss auch den Fall behandeln, dass die subList null ist, daher haben wir am Anfang von isSubsetManual eine Prüfung hinzugefügt.

Speichern Sie die modifizierte SubsetCheck.java-Datei.

Kompilieren Sie den aktualisierten Code im Terminal:

javac SubsetCheck.java

Und führen Sie das Programm erneut aus:

java SubsetCheck

Sie sollten eine Ausgabe ähnlich der folgenden sehen:

Main List: [Apple, Banana, Cherry, Date]
Sub List: [Banana, Cherry]
Is subList a subset of mainList (containsAll)? true
Is subList a subset of mainList (manual check)? true

Another List: [Banana, Grape]
Is anotherList a subset of mainList (containsAll)? false
Is anotherList a subset of mainList (manual check)? false

Empty List: []
Is emptyList a subset of mainList (containsAll)? true
Is emptyList a subset of mainList (manual check)? true
Is mainList a subset of emptyList (containsAll)? false
Is mainList a subset of emptyList (manual check)? false

Null List: null
Checking with nullList using containsAll() resulted in: java.lang.NullPointerException
Checking with nullList using manual check resulted in: java.lang.NullPointerException: Sub list cannot be null for manual check.

Aus der Ausgabe können Sie Folgendes beobachten:

  • Eine leere Liste wird als Teilmenge jeder Liste (einschließlich einer anderen leeren Liste) betrachtet. Sowohl containsAll() als auch unsere manuelle Methode identifizieren dies korrekt.
  • Eine nicht-leere Liste ist keine Teilmenge einer leeren Liste.
  • Das Übergeben einer null-Liste an containsAll() oder unsere manuelle Methode (ohne eine Null-Prüfung) führt zu einer NullPointerException. Dies zeigt die Wichtigkeit der Behandlung möglicher null-Werte in Ihrem Code auf.

Dieser Schritt beendet unsere Untersuchung der Prüfung von Teilmengen in Java-Listen. Sie haben gelernt, wie Sie die integrierte containsAll()-Methode verwenden, wie Sie die Prüfung manuell durchführen und wie sich diese Methoden mit leeren und null-Listen verhalten.

Zusammenfassung

In diesem Lab haben wir gelernt, wie man prüft, ob eine Liste alle Elemente einer anderen Liste in Java enthält. Wir haben uns hauptsächlich auf die Verwendung der bequemen containsAll()-Methode konzentriert, die von der Collection-Schnittstelle (Interface) bereitgestellt wird.

Wir haben gezeigt, wie man containsAll() mit Beispiel-Listen verwendet und beobachtet, wie es sich sowohl im Fall einer Teilmenge als auch im Fall einer Nicht-Teilmenge verhält. Diese Methode bietet eine kompakte und effiziente Möglichkeit, diese häufige Listenvergleichsaufgabe auszuführen.