0

私はこのプロジェクトで緊急に助けが必要です。プログラミング課題のクラスを実装しようとしていますが、 、、およびのメソッドでBagハングアップしています。addAll()Union()equals()

編集:割り当てによるとaddAll()、2番目の配列のすべてのオブジェクトを最初の配列に追加することになっています。実行時にエラーが発生しなくなりましたが、何らかの理由で 2 番目の配列のすべての要素が追加されず、最初の 2 つしか追加されません。

編集:についてUnion()は、最初の 2 つのバッグのすべての内容を含む 3 番目のバッグを作成することになっています。ArrayIndexOutOfBoundsExceptionこのメソッドを実行すると、エラーが発生しました。biddulph.r に続くコードを更新しましたが、これもうまく機能しています。再度、感謝します!

編集:「最初の試み」そしてequals()、バッグのサイズをチェックしてサイズが等しいことを確認し、次に同じ数字が含まれているかどうかをチェックすることになっています。したがって、現在書かれているように、私のequals()メソッドはサイズを比較してそのブール値を返しますが、実際の値を比較する方法がわかりません。

import java.util.Arrays;
import javax.swing.*;

public class bag {
  int maxSize = 10; //Size of the arrays
  int count = 0; //Number of items stored in the array
  int[] a;
  int[] b;
  bag c;
  bag d;

  public bag() {
    //for(int i = 0; i < maxSize; i++){
    //a[i] = (int)(1+Math.random()*100);
    //}
    a = new int[maxSize];
  }

  public String bagString() {
    return Arrays.toString(a);
  }

  public void add(int b) {
    try {
      a[count] = b;
      count++;
    } catch (ArrayIndexOutOfBoundsException n) {
      JOptionPane.showMessageDialog(null, "Array is full, element will not be added");
    }
  }

  public void removeRandom() {
    int i = (int)(1 + Math.random() * (count - 1));
    a[i] = a[count - 1];
    a[count - 1] = 0;
    count--;
  }

  public void remove(int b) {
    for (int i = 0; i < maxSize; i++) {
      if (contains(b)) {
        a[i] = a[count - 1];
      }
    }
  }

  public boolean isEmpty() {
    if (count == 0) return true;
    else return false;
  }

  public boolean contains(int b) {
    int tf = 0;
    for (int i = 0; i < maxSize; i++) {
      if (a[i] == b) tf = 1;
    }
    if (tf == 1) return true;
    else return false;
  }

  public int size() {
    return count;
  }

  public void addAll(bag c, bag d) {
    if (a.length >= c.size() + d.size()) {
      for (int i = 0; c.size() <= d.size(); i++) {
        c.add(d.a[i]);
      }
    }
  }

  public void union(bag c, bag d) {
    bag bigger = new bag();
    for (int i = 0; i < c.size(); i++) {
      bigger.add(c.a[i]);
    }
    for (int i = 0; count < d.size() - 1; i++) {
      bigger.add(d.a[i]);
    }
    System.out.println(bigger.bagString());
  }

      public boolean equals(bag c, bag d){

        if(c.size() != d.size()){

                return false;

        }else{

                for(int i = 0; i < c.union(c, d).size(); i++){

                        if(c.union(c, d).contains(c.a[i]) && c.union(c, d).contains(d.a[i])){

                        return true;                                   
                        }                              

                }              
                    return false;                              
        }

    }

}

皆さんが私に与えることができる助けに本当に感謝しています、ありがとう。

編集:ご協力いただきありがとうございます。皆さんは命の恩人です。

4

5 に答える 5

0

あなたの方法:

public void addAll(bag c, bag d) {
    if (a.length >= c.size() + d.size()) {
        for (int i = 0; c.size() <= d.size(); i++) {
            c.add(d.a[i]);
        }
    }
}

オブジェクト指向プログラミングに対するあなたの理解不足を露呈します。メソッド addAll() はすでにバッグに作用しているため、引数に 2 つのバッグを指定する必要はないことに注意してください。

呼び出し例:

mybag.addAll(yourBag); 

可能な使用法を示します。yourBag のすべてのコンテンツを myBag に追加します。

このメソッドを無料で提供します (配列 'a' にバッグの内容が含まれていると仮定します。変数名が明確でないため、わかりません)。

public void addAll(Bag otherBag) {
    for (int i : otherBag.a) {
        add(i);
    }
}

上記のメソッドは、otherBag のすべてのコンテンツをこのバッグにコピーします。

私が気付いたもう 1 つのこと - ab[] インスタンス変数もあります - それは何のためですか? 他にも 2 つのバッグ インスタンス変数があります。理由がわからない。

于 2013-02-01T17:37:00.333 に答える
0

全て追加する

書かれているように、この関数にはいくつかの問題があります。1 つ目は、発信者を混乱させることです。このメソッドを使用するコードは次のようになります。

Bag bag1 = ...
Bag bag2 = ...
Bag bag3 = ...

bag1.addAll(bag2, bag3)

...またはおそらくbag2.addAll(bag2, bag3)。この関数は、あるバッグから別のバッグに要素を追加することを目的としていますが、呼び出し元が 3 つの異なるバッグを指定する必要があるのはなぜですか? 関係者は2人だけ。関数を static にして、同じように呼び出せるようにするBag.addAll(bag1, bag2)か、(より良い) 単一の引数を取るようにして、追加された要素を誰が取得しているかを完全に明確にする必要がありますbag1.addAll(bag2)

2 番目の問題は、関数が正しく実装されていないことですが、2 つではなく 3 つのバッグが関係しているため、混乱しているためだと思います。修正方法をスケッチするには:

Bag target = ...
Bag source = ...

if (target.a.length >= target.size() + source.size()) {
    for (int i = 0; i < source.a.length; i++) {
        target.add(source.a[i]);
    }
}

良い変数名はあなたの友達です。

連合

実装でどのような問題が発生したかを特定していないため、単純に書き直すつもりはありません。質問を問題で編集してください。お手伝いします。

staticただし、これは(実際には Factory メソッド) であるべきメソッドの優れた例です。次のように呼び出すことができるはずですBag biggerBag = Bag.union(bag1, bag2)

.unionの問題に関する彼のコメントの後に編集

.union の問題は、他のサイズを使用して各バッグをループしていることです。sourceつまり、 からに各要素を追加する場合は、targetからの要素のみをカウントする必要がありますsource

bag bigger = new bag();
for (int i = 0; i <= c.size(); i++) {
  bigger.add(c.a[i]);
}    

あなたの方法は、より大きなバッグが十分に大きくないことを防げないことに注意してください。ループの前にあることを確認するか、十分な大きさのバッグを作成することをお勧めします.

等しい

繰り返しになりますが、それを書き込もうとしたことを示してから、何を支援する必要があるかを特定する質問をする必要があります。質問を更新してください。お手伝いします。

于 2013-02-01T17:05:39.240 に答える
0

最初に取り組むべきクラスの設計には多くの問題があると思います。バッグを静的配列または動的配列として表現している場合、必要な配列は 2 つではなく 1 つだけです。また、各バッグ内に属性として 2 つのバッグを含める必要はありません。これは意味がありません。残っている必要があるのは、バッグまたはカウントのサイズと、すべての要素 (この場合は整数) を保持する配列だけです。また、関数のパラメーターとクラスの属性に同じ名前を付けることも避けてください。そうしないと、コンパイラが混乱する可能性があり、属性を使用するために self.attributeName のようなコードが必要になります。それ以外の場合、コンパイラは、パラメーターについて話していると想定します。

これらの変更を行うと、残りはここから簡単になります。これは課題であるため、これらの変更を加えて再試行する必要があります。回答が提供されてもわからないためです。正しく構造化すると、はるかに簡単になることがわかります。

PS クラス名を大文字で始めるのは慣習です。Bagそしてそうではないbag

于 2013-02-01T17:10:28.240 に答える
0

addAll() の問題はこちら

   if (a.length >= c.size() + d.size()) {

        for (int i = 0; c.size() <= d.size(); i++) {
            c.add(d.a[i]);
        }
   }

c バッグが d よりも大きくなるまで要素を追加しないでください。d のすべての要素を c に追加する必要があります。

for (int i = 0; i < d.size(); i++) {
    c.add(d.a[i]);
}
于 2013-02-01T16:54:18.750 に答える
0

したがって、問題のある割り当ての部分は次のとおりです。

public void addAll(bag c, bag d){
    if (a.length >= c.size() + d.size()) {

        for (int i = 0; c.size() <= d.size(); i++) {
            c.add(d.a[i]);
        }
    }
}

あなたが言うには、2番目の配列のすべてのオブジェクトを最初の配列に追加することになっています。

それを分解して addAll() メソッドに適用すると、バッグ「d」内のすべてのアイテムをバッグ「c」に追加することになっているように聞こえます。

あなたの for ループは、i を 0 から開始し、 c のサイズが d 以下になるまで 1 を追加すると言っています。

つまり、 i を 0 から開始し、 d のすべての項目を完了するまで 1 を追加ます。

それは次のようになります。

for (int i = 0; i < d.size(); i++){
 c.add(d.a[i]);
} 

i は for ループを通過するたびに増加し、d のサイズになると i の増加が停止します (2 番目の条件)。この時点で、for ループを終了します。c のサイズを気にする必要はありません。

if (a.length >= c.size() + d.size())実際、おそらくラインを取り除くこともでき ます。

私の説明が、メソッドに変更が加えられた理由を理解するのに役立つことを願っています.

于 2013-02-01T16:54:27.463 に答える