繁体   English   中英

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

[英]How to write an implementation class for a Bag (or Multiset) ADT?

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

是作业描述,是我提供的界面。 到目前为止,是我的实现类。 我还没有写我的任何方法,因为我不知道从哪里开始,特别是关于 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,但我认为我不需要将它们包含在这篇文章中,因为它们非常基础。 任何帮助或朝正确方向的推动都会很棒。 谢谢!

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

目前还不清楚房间的限制是什么,因此,现在您可以定义一个名为 room 的私有成员,它将是 int 并且每当您打算添加一个字符串时,请检查房间的基数。 如果它更小,则增加地图条目的值(如果存在)。 如果没有,则只需使用值 1 创建它。

删除应该检查包含。 如果您拥有的 Map 不包含该项目,则抛出异常。 否则,如果映射条目的值大于 1,则递减它。如果它是 1,则将其从映射中删除。

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

contains 应该很简单,您只需要调用地图的方法。 count 也应该很简单。

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

编辑

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

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