0

我急需这个项目的帮助。我正在尝试Bag为编程作业实现一个类,并且我正在挂断addAll(),Union()equals(), 方法。

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

编辑:对于Union(),我应该创建第三个袋子,其中包含前两个袋子的所有内容。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 的所有内容复制到这个包中。

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

于 2013-02-01T17:37:00.333 回答
0

我认为您应该首先解决的课程设计存在很多问题。如果您将包表示为静态或动态数组,那么您只需要一个数组,而不是 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]);
        }
    }
}

您所说的应该将第二个数组中的所有对象添加到第一个数组中

如果您将其分解并将其应用于您的 addAll() 方法,听起来您应该将包“d”中的所有项目添加到包“c”中。

你的 for 循环说从 0 开始 i,然后添加 1直到c 的大小小于或等于 d

它应该说的是从 0 开始 i,然后将 1 添加到它,直到你完成了d 中的每个项目

看起来像这样:

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

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

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

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

于 2013-02-01T16:54:27.463 回答
0

全部添加

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

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一个方法(实际上是工厂方法)。它应该不能被称为:Bag biggerBag = Bag.union(bag1, bag2).

在他对 .union 问题发表评论后进行编辑

.union 的问题在于您使用其他尺寸循环遍历每个袋子。归结为,如果您想将 in 中的每个元素添加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 回答