我迫切需要这个项目的帮助。我正在尝试为编程任务实现一个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;
}
}
}
非常感谢你们给我的任何帮助,谢谢。
编辑:感谢大家的帮助,你们都是救命的人。
答案 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个包实例变量。不知道为什么。