繁体   English   中英

用Java构建bag类

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM