Store the current list in a mutable field; insertion and deletion can use its head:
class MSet[T](contents: List[T]) {
  protected var data: List[T] = contents

  def add(x: T): Unit = {
    data = x :: data
  }

  def delete(): T = data match {
    case x :: xs => data = xs; x
    case Nil => throw new NoSuchElementException("MSet.delete")
  }
}
The representation invariant interprets the list by its multiset of occurrences; order is immaterial and duplicates remain distinct occurrences. add increases one multiplicity, while delete returns and removes one occurrence. The field is protected so the minimum-search subclass in part (d) can inspect it. Both successful updates take list operations. Deleting from an empty bag raises an explicit exception.

Articles by others on the same topic (0)

There are currently no matching articles.