Вычисление декартова произведения двух множеств в Java: методы и примеры

Чтобы вычислить декартово произведение двух наборов в Java, вы можете использовать разные подходы. Вот несколько методов, которые вы можете рассмотреть:

Метод 1: вложенные циклы
Один простой метод – использовать вложенные циклы для перебора каждого элемента двух наборов и создания всех возможных комбинаций.

import java.util.*;
public class CartesianProduct {
    public static <T> Set<Set<T>> cartesianProduct(Set<T> setA, Set<T> setB) {
        Set<Set<T>> product = new HashSet<>();
        for (T a : setA) {
            for (T b : setB) {
                Set<T> pair = new HashSet<>();
                pair.add(a);
                pair.add(b);
                product.add(pair);
            }
        }
        return product;
    }
    public static void main(String[] args) {
        Set<Integer> setA = new HashSet<>(Arrays.asList(1, 2, 3));
        Set<Integer> setB = new HashSet<>(Arrays.asList(4, 5));
        Set<Set<Integer>> result = cartesianProduct(setA, setB);
        System.out.println(result);
    }
}

Метод 2: Stream API
Вы также можете использовать Stream API Java 8 для вычисления декартова произведения.

import java.util.*;
import java.util.stream.Collectors;
public class CartesianProduct {
    public static <T> Set<Set<T>> cartesianProduct(Set<T> setA, Set<T> setB) {
        return setA.stream()
                .flatMap(a -> setB.stream()
                        .map(b -> new HashSet<>(Arrays.asList(a, b))))
                .collect(Collectors.toSet());
    }
    public static void main(String[] args) {
        Set<Integer> setA = new HashSet<>(Arrays.asList(1, 2, 3));
        Set<Integer> setB = new HashSet<>(Arrays.asList(4, 5));
        Set<Set<Integer>> result = cartesianProduct(setA, setB);
        System.out.println(result);
    }
}

Эти методы дадут вам декартово произведение двух наборов. Декартово произведение — это набор всех возможных упорядоченных пар (a, b), где a — элемент из первого набора, а b — элемент из второго набора.