2016-10-23 16 views
2

2つのアレイを使用してデカルト積をどのように行うことができますか?2つのアレイのデカルト積

A = {1, 2, 3} 
B = {2, 3, 4} 
C = {(1, 2), (1, 3), (1, 4), (2, 2), (2, 3), (2, 4), (3, 2), (3, 3), (3, 4)}. 

これは私が使用していたコードですが、私は常にIndexOutOfBoundExceptionを取得します。出力配列の

public int[] cartesianProduct(int[] s1, int[] s2) { 

    ArrayList<Integer> list = new ArrayList<>(); 
    for(int i=0;i < s1.length;i++){ 
    for (int v1: s1) { 
     for (int v2: s2) { 
      list.add(s1[i], s2[i]); 
      } 
     } 
    } 
     int[] result = new int[list.size()]; 
     int k=0; 
     for(int i: list){ 
      result[k++] = i; 
     } 
     return result; 
} 
+1

あなたは 'list.add何を期待し(S1 [i]は、S2 [i])とを取得する;'行うために? – Eran

+0

デカルト製品にはどのような表現を使いますか?現在、数字のペアを表すものはありません。 –

+0

上記のようにArrayListに値を代入し、上記のようにリストを出力したいと思います。しかし、この方法は機能しません。 –

答えて

1

要素は、したがって、intアレイ出力の種類とすることができず、あなたがデータを収集するList<Integer>を使用することができない、整数のペアであるべきです。

数値の各ペアを表す1つの方法は、2つの要素のint配列です。 @Eranによって与えられた答えの代わりに、私はちょうどのリストを有するで停止するように

public int[][] cartesianProduct(int[] s1, int[] s2) { 
    List<int[]> list = new ArrayList<>(); 
    for (int v1: s1) { 
     for (int v2: s2) { 
      list.add(new int[]{v1, v2}); 
     } 
    } 
    int[][] result = new int[list.size()][2]; 
    int k=0; 
    for(int[] i: list){ 
     result[k++] = i; 
    } 
    return result; 
} 
+0

これを印刷すると、私は奇妙な出力を得る。 –

+0

@MichaelLeeおそらく、配列はObjectのtoStringをオーバーライドしないからです。 'Arrays.deepToString(result)'を表示してください。 – Eran

+0

ありがとう、deepToStringは働いていましたが、これは今私が得た出力です [[1、2]、[1,2]、[1,2]、[1,2]、[1,2]、[1,2] ]、[1,2]、[1,2]、[1,2]、[2,3]、[2,3]、[2,3]、[2,3]、[2,3]、 [2,3]、[2,3]、[2,3]、[2,3]、[3,4]、[3,4]、[3,4]、[3,4]、[3 、[3、4]、[3,4]、[3,4]、[3,4]] –

0

:出力が2Dアレイになり、このようにして、データを収集するために使用ListList<int[]>することができます順序付きペア:

public List<int[]> cartesianProduct(int[] s1, int[] s2) { 
    List<int[]> list = new ArrayList<int[]>(); 
    for (int v1: s1) { 
     for (int v2: s2) { 
      list.add(new int[]{v1, v2}); 
     } 
    } 

    return list; 
} 

出力を取得するには、次のようにリストを反復するだけです。

用途:

int[] s1 = new int[] {1, 2, 3}; 
int[] s2 = new int[] {2, 3, 4}; 
List<int[]> list = cartesianProduct(s1, s2); 
System.out.print("{"); 
for (int i=0; i < list.size(); ++i) { 
    if (i > 0) System.out.print(", "); 
    System.out.print("(" + list.get(i)[0] + ", " + list.get(i)[1] + ")"); 
} 
System.out.println("}"); 
0

あなたはListは必要ありません。これを試して。 java8

public static int[][] cartesianProduct(int[] s1, int[] s2) { 
    int size1 = s1.length; 
    int size2 = s2.length; 
    int[][] result = new int[size1 * size2][2]; 
    for (int i = 0, d = 0; i < size1; ++i) { 
     for (int j = 0; j < size2; ++j, ++d) { 
      result[d][0] = s1[i]; 
      result[d][1] = s2[j]; 
     } 
    } 
    return result; 
} 
1

Cartesian製品

int[] A = { 1, 2, 3 }; 
    int[] B = { 2, 3, 4 }; 
    int[][] AB = Arrays.stream(A).boxed().flatMap(ai -> Arrays.stream(B).boxed().map(bi -> new int[] { ai, bi })).toArray(int[][]::new); 
    System.out.println("cartesian " + Arrays.deepToString(AB)); 

出力

cartesian [[1, 2], [1, 3], [1, 4], [2, 2], [2, 3], [2, 4], [3, 2], [3, 3], [3, 4]] 
関連する問題