0

セットを引数として受け取り、セットのペアを返すデカルト積メソッドを 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;
}
4

2 に答える 2

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;
}
于 2014-02-08T01:01:37.817 に答える
0

PairApache Commons から使用していると仮定するとadd

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

add2 つの引数を取るセットのメソッドはありません。Pairセットに追加するには、を作成する必要があります。それがコンパイルされない場合は、試してください

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

また、配列に対して . ではなくSandを意味していると思います。特定の数の要素を事前に割り当てる理由はありません。さらに、どちらかのセットに 100 個を超える要素がある場合、記述した方法では、目的のサイズのまったく新しい配列が返されますが、関数の結果を使用していないため、配列が失われます。私は好むだろう:TStringtoArray

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

長さゼロの配列は単なる「ダミー」であり、その目的はtoArrayObject[].

編集:拡張forループを使用すると、配列を使用するよりもはるかに優れています。カミロの答えを見てください。

于 2014-02-08T01:01:00.930 に答える