Декартовы произведения с множествами в java

Я пытаюсь создать метод декартовых произведений в Java, который принимает наборы в качестве аргументов и возвращает пару наборов. Код, который я имею, покрывает аргументированные наборы массивами, а затем выполняет декартово произведение, но я не могу добавить его обратно к паре наборов, которую я хочу вернуть. Есть ли более простой способ сделать это? Заранее спасибо.

public static <S, T> Set<Pair<S, T>> cartesianProduct(Set<S> a, Set<T> b) {
    Set<Pair<S, T>> product = new HashSet<Pair<S, T>>();


    String[] arrayA = new String[100];
    String[] arrayB= new String[100];

    a.toArray(arrayA);
    b.toArray(arrayB);

    for(int i = 0; i < a.size(); i++){
        for(int j = 0; j < b.size(); j++){
            product.add(arrayA[i],arrayB[j]);
        }
    }
    return product;
}

2 ответа

Решение

Это выглядит проще,

public static <S, T> Set<Pair<S, T>> cartesianProduct(Set<S> a, Set<T> b) {
    Set<Pair<S, T>> product = new HashSet<Pair<S, T>>();

    for(S s : a) {
        for(T t : b) {
            product.add(new ImmutablePair<S, T>(s,t));
        }
    }

    return product;
}

Предполагая, что вы используете Pair от Apache Commons, тогда я думаю, что вы хотите add быть

product.add(Pair.of(arrayA[i],arrayB[j]));

Нет никаких add метод для множеств, который принимает два аргумента. Вы должны создать Pair добавить в набор. Если это не скомпилируется, попробуйте

product.add(Pair<S,T>.of(arrayA[i],arrayB[j]));

Кроме того, я предполагаю, что вы имели в виду S а также T для ваших массивов, а не String, Нет причин предварительно выделять определенное количество элементов. Кроме того, как вы написали, если в каждом наборе более 100 элементов, toArray вернет весь новый массив с желаемым размером, но вы не используете результат функции, так что массив будет потерян. Я бы предпочел:

S[] arrayA = a.toArray(new S[0]);
T[] arrayB = b.toArray(new T[0]);

Массивы нулевой длины - это просто "пустышки", целью которых является получение toArray возвращать массивы с правильным типом элемента, вместо Object[],

РЕДАКТИРОВАТЬ: Использование расширенного for цикл намного лучше, чем использование массивов. Смотрите ответ Камило.

Другие вопросы по тегам