0

コレクションを使用して Bag クラスを作成する必要があります (Java の組み込みコレクションではありません)。このための equal() メソッドを理解するのに苦労しています。基本的に、両方のバッグが同じサイズかどうかを確認し、それらのコピーを作成し、ユニオンを使用してそれらを結合し、for ループで現在の値が各バッグにあるかどうかを確認する必要があります。その場合は、それらを削除してください。両方のバッグが空の場合、それらは等しいです。何らかの理由で、コードが false を吐き出し続けますか?

すべてのコードで申し訳ありませんが、ほとんどのコードが一致するため、何を除外するかを特定するのは困難です。

助けてくれてありがとう!!

編集:これは、次の質問にも当てはまります: Javaでバッグクラスを構築する

public class Bag<t> implements Plan<t>{
private final int MAX = 10;
private final int DEFAULT = 6;

private static Random random = new Random();

private t[] content; 
private int count;


//Constructors
public Bag(){
    count = 0;
    content = (t[]) (new Object[DEFAULT]);
}
public Bag(int capacity){
    count = 0;
    if(capacity<MAX)
        content = (t[])(new Object[capacity]);
    else System.out.println("Capacity must be less then 10");
}


//Implemented Methods
public void add(t e) {
    try{
        if(!contains(e) && (!(size() == content.length))){
            content[count] = e;
            count++;
        }
        }catch (ArrayIndexOutOfBoundsException exception){
            System.out.println("Bag is Full");
        }
}


public boolean isEmpty() {

    return count==0;        
}


public boolean contains(t e) {
    Object location = null;

    for(int i=0;i<count;i++)
        if(content[i].equals(e)) location=i;

    return (location!=null);
}


public int size() {

    return count;
}


public void addAll(Bag<t> b) {
    for (int i=0;i<b.size();i++)
        add(b.content[i]);
}


public Bag<t> union(Bag<t> a, Bag<t> b) {
    Bag<t> bigBag = new Bag<t>();

    for(int i=0; i<a.size();i++)
        bigBag.add(a.content[i]);
    for(int k=0; k<b.size();k++)
        bigBag.add(b.content[k]);

    return bigBag;
}


public boolean equals(Bag<t> e) {
    Bag<t> bag1 = new Bag<t>();
    Bag<t> bag2 = new Bag<t>();
    Bag<t> bag3 = new Bag<t>();
    t object;

    if(size() == e.size()){
        bag1.addAll(this);
        bag2.addAll(e);

        bag3.union(bag1, bag2);

        for(int i=0; i<bag3.size();i++){
            object = bag3.content[i];
            if((bag1.contains(object)) &&(bag2.contains(object))){
                bag1.remove(object);
                bag2.remove(object);

            } 

        }
    }


    return (bag1.isEmpty()&&(bag2.isEmpty()));

}
4

1 に答える 1

0

問題は、union() メソッド、またはその使用方法にあるようです。bag1バッグを追加bag2するのではなく、実際に新しいバッグを返し、bag3どのようequals()に動作することを期待しています。

クラスメソッドについてまだ知っていますか?これがunion()本当のことです。staticのように、署名にキーワードを追加します。

public static Bag<t> union(Bag<t> bag1, Bag<t> bag2)

ここで、equals メソッドの定義を修正しましょう。equals()サンプル コードのには、

public boolean equals(Bag<t> e)

しかし、これは

public boolean equals(Object o)

したがって、 が最初oであることを確認する必要がありBagます。

public boolean equals(Object o) {
    if (this == obj) {
        return true;
    } else if (obj == null) {
        return false;
    } else if (!(obj instanceof Bag))
        return false;
    }

    Bag<?> other = (Bag<?>) obj;
    if (this.count != other.count) {
        return false;
    }

    Bag<t> bag1 = new Bag<t>();
    Bag<t> bag2 = new Bag<t>();
    bag1.addAll(this);
    bag2.addAll(other);

    // If you don't know about `static` yet, just use this instead of the following I guess 
    //Bag<t> bag3 = new Bag<t>();
    //bag3 = bag3.union(bag1, bag2);
    Bag<t> bag3 = Bag.union(bag1, bag2);

    t object;
    for(int i=0; i<bag3.size();i++) {
        object = bag3.content[i];
        if ((bag1.contains(object)) && (bag2.contains(object))){
            bag1.remove(object);
            bag2.remove(object);
        }
    }

    return (bag1.isEmpty() && (bag2.isEmpty()));
}

いくつかのブレース/コンパイラ エラーを修正すると、これでうまくいくと思います。remove()ただし、欠落しているメソッドなしではテストできません。

于 2013-02-07T06:05:30.113 に答える