如何编写Bag(或Multiset)ADT的实现类?

时间:2019-03-07 16:43:12

标签: java arrays adt multiset bag

我有一个作业,其中需要编写Bag(或Multiset)ADT的实现类。问题是,作业的措辞很难理解,我不确定我到底需要做什么。

Here是分配说明,here是提供的接口。到目前为止,This是我的实现类。我还没有编写任何方法,因为我不确定从哪里开始,尤其是关于3个不同的构造函数。

package Bags;


import java.io.*;


public class ConBag implements Bag, Serializable {


  private String[]  items;     // The items in the bag
  private int       itemCount; // The number of items
  private int       size;      // The size of the bag



  // This constructor creates a new empty bag able to hold 100 items.
  public ConBag ( ) {

    this(100);

  }; // Constructor



  // This constructor creates a new bag with a specified capacity.
  public ConBag ( int size ) {

    items = new String[size];

  }; // Constructor



  // This constructor takes an array of Strings and copies them into a bag of 100 or fewer items.
  public ConBag ( String[] items ) {



  }; // Constructor



  public void add ( String item ) {

    try{
      if(!contains(item) && (!(size == items.length))){
        items[itemCount] = item;
        itemCount++;
      }
    }catch (NoSpaceException exception) {
      System.out.println("Bag is full.");
    }    
  }; // Add



  public void remove ( String item ) {

    for (int i=0; i<size; i++) {
      if (contains(item)) {
        items[i] = items[itemCount-1];
      }else {
        NoItemException exception; 
        System.out.println("Item not in bag.");
      }
    }    
  };



  public int cardinality ( ) {

    return itemCount;    
  };



  public boolean contains ( String item ) {

    for (int i=0; i<itemCount; i++) {
      if(items[i].equals(item))
        return true;
    }
    return false;   
  };



  public int count ( String item ) {

    int count;

    return count;    
  };



  public String draw ( ) {



  };

}

我觉得我错过了一些重要的事情,但是我不知道是什么。我已经有NoItemException和NoSpaceException,但是我认为我不需要在它们中包含它们,因为它们非常基础。在正确的方向上提供任何帮助或推动都会很棒。谢谢!

1 个答案:

答案 0 :(得分:0)

您需要允许重复,因此使用String数组作为数据结构会使事情变得困难。最好使用键为String且值为Integer的映射。

尚不清楚房间的限制是什么,因此,现在,您可以定义一个名为room的私有成员,该成员将是int的,并且每当您要添加String时,请检查针对room的基数。如果较小,则增加映射条目的值(如果存在)。如果没有,则只需将其创建为1。

删除应检查是否包含。如果您拥有的地图不包含该项目,则引发异常。否则,如果大于1则减小地图项的值。如果为1,则只需将其从地图中删除。

要计算基数,请遍历地图并计算值的总和。

包含的内容应该很简单,您只需调用地图的方法即可。计数也应该很简单。

绘画很有趣。首先,计算基数,将其用作随机化无法达到的上限,并初始化总和并开始遍历该图。在每次迭代中,将map条目的值加和(在循环之前为0)。如果随机数小于总和,则调用remove并传递该项的键,然后退出循环。

编辑

如果您需要使用String项数组来执行此操作,则可以这样做,但是还需要为每个String存储一个整数,这将是另一个数组,最简单的表示是确保每个String数组中的item项将与int数组中同一索引处的int值相关联。不太优雅,但是可以使用。现在,在这种情况下,您不能使用Map方法,而需要自己实现。