Bag类用Java实现

时间:2013-02-07 05:15:11

标签: java eclipse data-structures collections

我不得不通过使用集合(而不是Java内置的Collection)来创建Bag类。我无法找到equ()方法。基本上它需要检查两个包是否大小相同,为它们创建副本,使用联合来加入它们,并在for循环中检查当前值是否在每个包中;如果是这样,删除它们。如果两个袋都是空的那么它们是相同的。由于某种原因,代码一直在吐出错误?

我为所有代码道歉,但很难确定要遗漏的内容,因为大多数代码都是重合的。

感谢所有帮助!!

编辑:这也伴随着这个问题:Building a bag class in 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()));

}

1 个答案:

答案 0 :(得分:0)

问题似乎出现在你的union()方法中,或者你使用它的方式。它实际上返回了一个新的Bag,而不是将bag1bag2添加到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

因此,我们必须先确保Bagpublic 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()

修复一些大括号/编译器错误,我认为这可能有效。如果没有缺少{{1}}方法,我无法测试它。