[英]Building a bag class in Java
我非常需要这个项目的帮助。 我正在尝试为编程分配实现Bag
类,而我addAll()
了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;
}
}
}
非常感谢你们能给我的任何帮助,谢谢。
编辑:感谢大家的帮助,你们是生命的救星。
您的addAll()问题在这里
if (a.length >= c.size() + d.size()) {
for (int i = 0; c.size() <= d.size(); i++) {
c.add(d.a[i]);
}
}
在c bag大于d之前,不应该添加元素,而应将d的所有元素都添加到c。
for (int i = 0; i < d.size(); i++) {
c.add(d.a[i]);
}
因此,您遇到的部分作业是:
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为止 。
应该说的是, 将 i从0开始 ,然后将其加1 ,直到遍历d中的每个项目为止。
看起来像这样:
for (int i = 0; i < d.size(); i++){
c.add(d.a[i]);
}
每次您通过for循环时,i都会增加,当您达到d的大小(第二个条件)时,我将停止增加。 此时,您将退出for循环。 您不必担心c的大小。
实际上,您也可以摆脱if (a.length >= c.size() + d.size())
行。
希望我的解释可以帮助您理解为什么对方法进行了更改。
都加进去
编写此函数有两个问题。 首先是它使调用者感到困惑。 使用此方法的代码将如下所示:
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]);
}
请注意,您的方法无法防止较大的袋子不够大。 您应该检查一下以确保它在循环之前,或者甚至最好创建一个足够大的袋子。
等于
同样,您需要证明自己已尝试编写它,然后提出一个问题,指出需要帮助的内容。 更新您的问题,我会帮助。
我认为您在设计班级时遇到很多问题,应该首先解决。 如果将包表示为静态或动态数组,则只需要一个数组,而不是2。每个包内也不需要两个包作为属性,这没有任何意义; 您所剩下的只是包或计数的大小以及容纳所有元素的数组(在您的情况下是整数)。 同样,避免以相同的方式为类的函数和属性命名参数。 不这样做可能会使编译器感到困惑,并且需要使用self.attributeName之类的代码才能使用属性; 否则,编译器会假设您正在谈论参数。
如果进行了这些更改,则其余部分应从此处直接进行。 由于这是一项作业,因此您应该进行这些更改,然后重试,因为您将无法了解我们是否会为您提供答案; 您会发现,一旦正确构建它,它将变得更加容易。
附言:按照惯例,以大写字母开头的类名。 Bag
而不是bag
您的方法:
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()已经作用在bag上,因此您无需在参数中指定2个bag。
调用示例:
mybag.addAll(yourBag);
将演示可能的用法-它将yourBag的所有内容添加到myBag中。
我将免费为您提供此方法(假设数组“ a”包含袋子中的内容-由于您的变量名不清楚,因此我不确定):
public void addAll(Bag otherBag) {
for (int i : otherBag.a) {
add(i);
}
}
上面的方法会将otherBag的所有内容复制到此包中。
我注意到的另一件事-您也有ab []实例变量-那是做什么用的? 您还具有其他2个bag实例变量。 不知道为什么。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.