用Java构建一个bag类

时间:2013-02-01 16:47:42

标签: java collections bag

我迫切需要这个项目的帮助。我正在尝试为编程任务实现一个Bag类,而且我对addAll()Union()equals()方法感到困惑。

编辑:根据作业,addAll()应该将第二个数组中的所有对象添加到第一个数组中。我运行它时不再出错,但由于某种原因,它不会添加第二个数组中的所有元素,它只会添加第一个2.感谢大家,这个现在工作得很好!

编辑:对于Union(),我应该创建第三个包,其中包含前2个包的所有内容。运行此方法时,我得到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;                              
        }

    }

}

非常感谢你们给我的任何帮助,谢谢。

编辑:感谢大家的帮助,你们都是救命的人。

5 个答案:

答案 0 :(得分: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]);
}

答案 1 :(得分: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()方法,听起来你应该将包“d”中的所有项目添加到包“c”中。

你的for循环说开始我0 加1 直到c的大小小于或等于d

应该说的是从0开始添加1 ,直到您完成 d 中的每个项目。

看起来像这样:

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

每次你进入for循环时我都会增加,当你达到d的大小时(第二个条件),我会停止增加。此时您将退出for循环。您不必担心c的大小。

事实上你也可以摆脱if (a.length >= c.size() + d.size())行。

我希望我的解释可以帮助您理解为什么对该方法进行了更改。

答案 2 :(得分:0)

<强>的addAll

写这个函数有几个问题。首先是它让来电者感到困惑。使用此方法的代码将是这样的:

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

bag1.addAll(bag2, bag3)

......或者bag2.addAll(bag2, bag3)。该功能旨在将一个包中的元素添加到另一个包中,那么为什么呼叫者必须指定三个不同的包?只涉及两个。你应该将函数设置为静态,因此它可以像Bag.addAll(bag1, bag2)一样调用,或者(更好)通过使它成为一个参数bag1.addAll(bag2)来完全清楚谁添加了元素。

第二个问题是功能没有正确实现,但我认为这是因为你因为你有三个包而不是两个包而感到困惑。要勾勒出如何修复它:

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]);
}    

请注意,您的方法无法防止较大的包不够大。你应该检查一下,确保它在循环之前,或者甚至更好地创造一个足够大的包。

<强>等于

同样,您需要证明您已尝试编写它,然后询问一个问题,指明您需要帮助的内容。更新你的问题,我会帮助。

答案 3 :(得分:0)

我认为你应该首先解决的课程设计存在很多问题。如果您将袋子表示为静态或动态阵列,那么您只需要一个阵列,而不是2.你也不需要在每个袋子里面放两个袋作为属性,这没有任何意义;您应该剩下的就是包或计数的大小以及包含所有元素的数组(在您的情况下是整数)。此外,避免以相同的方式为类的函数和属性命名参数。不这样做可能会混淆编译器,并且需要像self.attributeName这样的代码来使用属性;否则,编译器假定您正在讨论参数。

如果你做了这些改动,其余部分应该从这里直截了当。由于它是一项任务,您应该进行这些更改并重试,因为您不知道我们是否为您提供了答案;一旦你正确地构建它,你会发现它会容易得多。

P.S。它是一个用大写字母开始一个类名的约定。 Bag而非bag

答案 4 :(得分: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的所有内容复制到此包中。

我注意到的另一件事 - 你还有一个b []实例变量 - 这是为了什么? 您还有另外2个包实例变量。不知道为什么。