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