Проверка с использованием ручного цикла
На предыдущем этапе мы использовали удобный метод containsAll()
для проверки на подмножество. Хотя метод containsAll()
является эффективным, полезно понять, как выполнить такую проверку вручную с использованием цикла. Это углубит ваше понимание того, как могут работать внутренние методы коллекций.
Давайте добавим новый метод в наш файл SubsetCheck.java
для ручной проверки на подмножество. Откройте файл ~/project/SubsetCheck.java
в редакторе WebIDE.
Добавьте следующий метод внутри класса SubsetCheck
, но вне метода main
:
// 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;
}
Этот новый метод isSubsetManual
принимает два списка в качестве входных параметров. Затем он проходит по каждому element
в subList
. Внутри цикла он проверяет, содержит ли mainList
текущий element
с использованием метода contains()
. Если он находит хотя бы один элемент в subList
, который не присутствует в mainList
, он сразу понимает, что subList
не является подмножеством и возвращает false
. Если цикл завершается без нахождения элементов в subList
, которых нет в mainList
, это означает, что все элементы присутствуют, и метод возвращает true
.
Теперь вызовем этот новый метод из нашего метода main
, чтобы сравнить его результат с результатом метода containsAll()
. Измените метод main
в файле SubsetCheck.java
, чтобы включить вызовы метода isSubsetManual
:
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;
}
}
Сохраните измененный файл SubsetCheck.java
.
Теперь скомпилируйте обновленный код в терминале:
javac SubsetCheck.java
И запустите программу снова:
java SubsetCheck
Вы должны увидеть вывод, похожий на следующий, который показывает, что и метод containsAll()
, и наш метод с ручным циклом дают одинаковые результаты:
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
Этот этап демонстрирует, что вы можете получить такой же результат, как и с методом containsAll()
, проитерировав по потенциальному подмножеству и проверив наличие каждого элемента в основном списке. Хотя метод containsAll()
обычно предпочтителен из-за его лаконичности и возможных оптимизаций производительности в Java-библиотеке, понимание ручного подхода ценно для обучения.