Как написать класс реализации для Bag (или Multiset) ADT? - PullRequest
0 голосов
/ 07 марта 2019

У меня есть задание, в котором мне нужно написать класс реализации для ADT Bag (или Multiset). Проблема в том, что задание сформулировано так, что за ним трудно следовать, и я не уверен, что именно мне нужно делать.

Здесь - это описание назначения, а здесь - предоставленный мне интерфейс. Этот пока что мой класс реализации. Я еще не написал ни одного из своих методов, потому что я не уверен, куда идти дальше, особенно в отношении трех различных конструкторов.

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 голосов
/ 07 марта 2019

Вам необходимо разрешить дублирование, поэтому использование массива String в качестве структуры данных усложняет задачу. Лучше использовать карту, где ключ - это строка, а значение - целое число.

Неясно, каков предел комнаты, поэтому на данный момент вы можете определить частного члена с именем room, который будет int и всякий раз, когда вы намереваетесь добавить строку, проверяйте количество элементов в комнате. Если он меньше, то увеличивайте значение записи карты, если она существует. Если этого не произошло, просто создайте его со значением 1.

удалить следует проверить на наличие. Если у вашей Карты нет элемента, выведите исключение. В противном случае уменьшите значение элемента карты, если оно больше 1. Если оно равно 1, просто удалите его с карты.

Чтобы вычислить количество элементов, пройдите по карте и вычислите сумму значений.

содержит должно быть просто, вам просто нужно вызвать метод вашей карты. счет должен быть простым.

ничья это интересно. Сначала вычислите количество элементов, используйте его как недостижимую верхнюю границу вашей рандомизации, инициализируйте сумму и начните обход карты. На каждой итерации увеличивайте сумму (которая равна 0 до цикла) значением записи в карте. Если случайное число меньше суммы, то вызовите remove, передав ключ элемента, и выйдите из цикла.

РЕДАКТИРОВАТЬ

Если вам нужно сделать это с массивом элементов String, то вы можете сделать это, но вам также нужно будет хранить целое число для каждой строки, это будет другой массив, и самым простым представлением будет гарантировать, что каждый Элемент в массиве String будет связан со значением int в массиве int с тем же индексом. Не слишком элегантно, но можно использовать. Теперь, в этом случае вы не могли бы использовать методы Map, но вам нужно будет реализовать вещи самостоятельно.

...