2016-06-22 4 views
0

私は、組み込みのJava APIやファンシー関数を使用せずにデカルト積とセットと関連したテキストブックから問題を解決しようとしています。Javaの2つのデカルト積のデカルト積

例えば セットAは、= {1,3,4}

セットBに含ま= {2,5}

それらの製品は、この結果に{(1,2)をもたらすであろう含有(1,5)、(3,2)、(3,5)、(4,2)、(4,5)}

各セットでさまざまな機能を実行するためのいくつかの方法を書いていますが、ここでは私が思いついたものこれをセットにどのように実装できますか?

public String cartesian(Set other) 
{ 
    String result = ""; 
    int res; 

    for (int i = 0; i < this.size; ++i) 
    { 
     for (int j = 0; j < other.size; ++j) 
     { 
      //System.out.println("@@@@@"+ other.size); 
      //result = data[i] + ""+ other[i] + ""; 
      //res = data[i] *= other.data[j]; 

     } 
    } 

    return result; 

} 

このメソッドは結果を文字列として返します。私の論理は、同時に各セットの要素を取得することですが、私はそれらを一緒に交差する方法を考えて立ち往生しています。

ここに私のコードの残りの部分があります。

public class Sets { 
     public static void main(String[] args) 
    { 

     Set set1; 
     set1 = new Set(); 


     Set set2 = new Set(); 

     set1.add(1); 
     set1.add(2); 
     set1.add(3); 

     set2.add(3); 
     set2.add(4); 
     /*set2.add(4); 
     set2.add(5);*/ 

     //System.out.println(set1.difference(set2)); 

     System.out.println(set1.cartesianReformed(set2)); 



    } 
} 

ユーザー定義Setクラスは、このような

class Set 
{ 
    private int[] data; 
    private int size; 

    public Set() 
    { 
     data = new int[20]; 
     size = 0; 

    } 

    public void add(int value) 
    { 
     int[] copy; 

     //avoiding duplicates 
     if (!in(value)) 
     { 
      if (size > data.length) 
      { 
       copy = new int[data.length * 2]; 

       System.arraycopy(data, 0, copy,0,data.length); 

       data = copy; 
      } 
      data[size] = value; 

      size++; 
     } 
     else 
     { 
      System.out.println("You are trying to insert a number that's already here ---> " + value); 
     } 

    } 

    public String toString() 
    { 
     String result = "{"; 
     for(int i = 0; i < size; i++) 
     { 
      result += "" + data[i]; 
      //Add a comma after all but the last item 
      if (i < size - 1) 
      { 
       result += ","; 
      } 

     } 
     result += "}"; 
     return result; 
    } 

    public boolean in(int value) 
    { 
     boolean result = false; 

     for(int i = 0; i < size; i++) 
     { 
      if (data[i] == value) 
      { 
       result = true; 
      } 
     } 

     return result; 
    } 

    public Set intersection(Set other) 
    { 
     Set result = new Set(); 

     for (int i = 0; i < size; ++i) 
     { 
      if (other.in(data[i])) 
      { 
       result.add(data[i]); 
      } 
     } 
     return result; 
    } 

    public boolean equals(Set other) 
    { 
     boolean result = false; 

     int count = 0; 

     for (int i = 0; i < size; ++i) //iterating over this 
     { 
      if (other.in(data[i])) 
      { 
       count++; 
      } 

      if (count == size) 
      { 
       result = true; 
      } 
     } 
     return result; 
    } 

    public Set difference(Set other) 
    { 
     Set result = new Set(); 

     for(int i = 0; i < size; ++i) 
     { 
      if (!other.in(data[i])) 
      { 
       result.add(data[i]); 
      } 
     } 

     return result; 
    } 



    public String cartesian(Set other) 
    { 
     String result = ""; 
     int res; 

     for (int i = 0; i < this.size; ++i) 
     { 
      for (int j = 0; j < other.size; ++j) 
      { 
       //System.out.println("@@@@@"+ other.size); 
       //result = data[i] + ""+ other[i] + ""; 
       //res = data[i] *= other.data[j]; 

      } 
     } 

     return result; 

    } 

    public Set union(Set other) { 
     Set result = (Set)other.clone(); 
     for (int i = 0; i < size; i++) { 
      result.add(data[i]); 
     } 
     return result; 
    } 

    public Object clone() { 
     Set result = new Set(); 
     for (int i = 0; i < size; i++) { 
      result.add(data[i]); 
     } 
     return result; 
    } 
} 
+0

このような文字列の出力を生成するか、 – v010dya

+0

2つのセットのデカルト積を得て、出力を生成することです@ v010dya – ekeith

答えて

2

何かが動作します:

public String cartesian (Set other) 
{ 
    String [] cart = new String [this.size * other.size]; 

    int k = 0; 
    for (int i : this.data) 
    { 
     for (int j : other.data) 
     { 
      cart[k++] = "(" + i + "," + j + ")"; 
     } 
    } 

    return Arrays.toString(cart); 
} 

戻り

[(1,2), (1,5), (3,2), (3,5), (4,2), (4,5)] 

:それはjava.util.Setと競合するので

  • クラスセットの命名は悪い考えです。
+0

これは 'public String cartesian(Set other)'の形式でなければならず、セットは整数の配列ではなく 'Set'オブジェクト – ekeith

+0

権利。クラスに合わせるだけです。また、あなたのSetクラスは実際にはint配列によってサポートされています。 –

+0

確かに、私はこれらのタイプのアプローチをオンラインでいくつか見てきましたが、私は自分の文脈でそれを使う方法を考え出していませんでした。 – ekeith

1

問題の要点に行きましょう。基本的には、2つのリストにすべての要素の組み合わせが必要です。以下は、ネストされたfor-loopsを使ってセットAとBの要素を調べる、非常に簡単な方法です。

Set<Integer> A = new HashSet<Integer>(); 
Set<Integer> B = new HashSet<Integer>(); 

for(int i = 1 ; i < 5 ; i++) 
    A.add(i); 

for(int i = 10 ; i < 13 ; i++) 
    B.add(i); 

System.out.println("A: " + A); 
System.out.println("B: " + B); 

List<Set<Integer>> list = new ArrayList<Set<Integer>>(); 

for(Integer i: A) { 
    for(Integer j: B) { 
     Set<Integer> combination = new HashSet<Integer>(); 
     combination.add(i); 
     combination.add(j); 
     list.add(combination); 
    } 
} 
System.out.println(list); 
+0

このメソッドは 'public String Cartesian(Set other)'のようになり、組み込みjavaメソッド/関数を含むことができないため、このコンテキストでは適用できません。 – ekeith

+0

@Edteraあなたは自分の 'Set'クラスを作成しているようですね。 –

+0

はい、自分のクラスを使用していて、既に持っているメソッドに固執しています。 – ekeith

関連する問題