1 / 44

Container Classes

Container Classes. Bags & Sequences. Operations on a Bag. Constructors default: creates bag with capacity of 10 with int argument: creates bag with specified capacity. Operations on a Bag. Modifiers: add-- place an item in a bag addMany, addAll – variations on add

vera
Download Presentation

Container Classes

An Image/Link below is provided (as is) to download presentation Download Policy: Content on the Website is provided to you AS IS for your information and personal use and may not be sold / licensed / shared on other websites without getting consent from its author. Content is provided to you AS IS for your information and personal use only. Download presentation by click this link. While downloading, if for some reason you are not able to download a presentation, the publisher may have deleted the file from their server. During download, if you can't get a presentation, the file might be deleted by the publisher.

E N D

Presentation Transcript


  1. Container Classes Bags & Sequences containers

  2. Operations on a Bag • Constructors • default: creates bag with capacity of 10 • with int argument: creates bag with specified capacity containers

  3. Operations on a Bag • Modifiers: • add-- place an item in a bag • addMany, addAll – variations on add • remove -- take an item out of a bag • ensureCapacity – enlarges bag if necessary • trimToSize – shrinks bag to current content capacity containers

  4. Operations on a Bag • Observers: • size -- returns total # of items in bag • countOccurrences -- returns # of items of a specific target value present in bag • getCapacity – returns current size of bag • clone – returns a copy of the calling bag containers

  5. Operations on a Bag • union: a static method for combining two bags • closest thing Java has to a “non-member” method • called from the class, operates on two bags passed to it as arguments, returns new bag containers

  6. Invariant of an ADT • An invariant is an explicit statement of the rules dictating how member variables are to be used • All methods may assume that the invariant is valid when they are called • Each method is responsible for ensuring continuing validity of the invariant when method returns containers

  7. Invariant for Bag 1. The number of items contained in the bag is stored in member variable manyItems 2. The bag entries are stored in member variable data, from position data[0] to position data[manyItems-1] containers

  8. Bag implementation: class heading & private members public class IntArrayBag implements Cloneable { // we add the “implements” clause so that the clone() // method can be used to create duplicate Bags private int[ ] data; private int manyItems; // purpose of each of these is described in the class invariant containers

  9. Bag definition: constructors public IntArrayBag( ) // default constructor { final int INITIAL_CAPACITY = 10; manyItems = 0; data = new int[INITIAL_CAPACITY]; } containers

  10. Bag definition: constructors public IntArrayBag(int initialCapacity) { if (initialCapacity < 0) throw new IllegalArgumentException ("The initialCapacity is negative: " + initialCapacity); data = new int[initialCapacity]; manyItems = 0; } containers

  11. Implementation of add( ) public void add(int element) { if (manyItems == data.length) ensureCapacity((manyItems + 1)*2); data[manyItems] = element; manyItems++; } containers

  12. Notes on add() • If adding an element to the array would exceed the current array capacity, the array is resized to accommodate the new data • This resizing is accomplished with a call to ensureCapacity (next slide) • Note that the array is resized to be twice its current capacity; this is meant to minimize the calls to ensureCapacity, a relatively costly operation containers

  13. Implementation of ensureCapacity() public void ensureCapacity(int minimumCapacity) { int[ ] biggerArray; if (data.length < minimumCapacity) { biggerArray = new int[minimumCapacity]; System.arraycopy(data, 0, biggerArray, 0, manyItems); data = biggerArray; } } containers

  14. Notes on ensureCapacity • This method and the next couple use the method System.arraycopy to copy elements from the parameter object’s array into the calling object’s array • Syntax: System.arraycopy (source array, source index, destination array, destination index, number of elements to copy) containers

  15. Implementation of addMany() public void addMany(int... elements) { if (manyItems + elements.length > data.length) ensureCapacity((manyItems + elements.length)*2); System.arraycopy(elements, 0, data, manyItems, elements.length); manyItems += elements.length; } containers

  16. Notes on addMany() • The parameter notation (int … elements) indicates the method takes a variable number of int arguments • The argument(s) passed to the method are treated like an array; for example, their number can be found by accessing the length member of the parameter (elements.length) containers

  17. Implementation of addAll() public void addAll(IntArrayBag addend) { ensureCapacity(manyItems + addend.manyItems); System.arraycopy(addend.data, 0, data, manyItems, addend.manyItems); manyItems += addend.manyItems; } containers

  18. Implementation of remove( ) public boolean remove(int target) { int index; // The location of target in the data array. for (index = 0; (index < manyItems) && (target != data[index]); index++) ; if (index == manyItems) return false; manyItems--; data[index] = data[manyItems]; return true; } containers

  19. Notes on remove() • Note the use of the empty for loop • we only want to establish position of element if it exists • we first check to see if we’re at a valid index before checking for element: (index < manyItems) && (target != data[index]); • Also note the implied else; since the if clause contains a return statement, the statements following will execute only if the return doesn’t happen containers

  20. Implementation of trimToSize() public void trimToSize( ) { int[ ] trimmedArray; if (data.length != manyItems) { trimmedArray = new int[manyItems]; System.arraycopy(data, 0, trimmedArray, 0, manyItems); data = trimmedArray; } } containers

  21. Implementation of observer methods public int getCapacity( ) { return data.length; } public int size( ){ return manyItems; } containers

  22. Implementation of countOccurrences public int countOccurrences(int target) { int answer = 0; for (int index = 0; index < manyItems; index++) if (target == data[index]) answer++; return answer; } containers

  23. Implementation of clone() public IntArrayBag clone( ) { IntArrayBag answer; try { answer = (IntArrayBag) super.clone( ); } catch (CloneNotSupportedException e) { throw new RuntimeException ("This class does not implement Cloneable"); } answer.data = data.clone( ); return answer; } containers

  24. Notes on clone() • The call to super.clone() is used to clone the object, but doesn’t clone all of the object’s contents • Note the separate housekeeping issue of cloning the array; in general, you will face this issue when cloning objects that contain object types as member variables containers

  25. Implementation of union public static IntArrayBag union(IntArrayBag b1, IntArrayBag b2) { IntArrayBag answer = new IntArrayBag(b1.getCapacity( ) + b2.getCapacity( )); System.arraycopy(b1.data, 0, answer.data, 0, b1.manyItems); System.arraycopy(b2.data, 0, answer.data, b1.manyItems, b2.manyItems); answer.manyItems = b1.manyItems + b2.manyItems; return answer; } containers

  26. Sequence ADT -- a different kind of container • Items in a sequence are arranged in order • Items are kept in sequence deliberately: member functions can step through the sequence one item at a time, in order • Can control where items are inserted and removed containers

  27. Invariant for the Sequence ADT • The number of elements in the Sequence is stored in member variable manyItems • The data are stored in array data, from data[0] to data[manyItems -1] • The current item is found in data[currentIndex]; if there is no current item, currentIndex == manyItems containers

  28. Class definition for Sequence ADT • Like the Bag class, Sequence implements the Cloneable interface • Private members include the three mentioned in the invariant containers

  29. Class definition for Sequence ADT -- iterators • Iterators: methods that provide capability to step through items in a container • Keep in mind: although we are currently implementing our ADTs using arrays, this will not always be the case • Furthermore, client programmers can’t access private class members – so array indexing isn’t available as an option for clients containers

  30. Iterator methods for Sequence • start( ) makes the first Item in the List the current item • advance( ) moves to the next item • isCurrent( ) ensures that there is an item at the current index • getCurrent( ) allows access to the current item containers

  31. Example of use of iterators & observers: printing a list Sequence myList = new Sequence(); // code omitted here – presumably, something gets added for (myList.start( ); myList.isCurrent( ); myList.advance( )) System.out.println(myList.getCurrent( ) ); containers

  32. Class definition for Sequence ADT -- modifiers • methods addAfter( ) and addBefore insert items into the sequence • addAfter() places the new element after the current element • addBefore() places the new element before the current element • In either case, the added element becomes the new current item • method removeCurrent removes the current item, provided one exists at the current index containers

  33. Other methods • Like Bag, Sequence is a container class, so many of the same methods (or very similar methods) are also provided; they include: • constructors • clone() • ensureCapacity() • trimToSize() • addAll() • getCapacity • a static method called concatenation: similar to Bag class’s union method containers

  34. Member function implementations // constructor -- creates empty sequence public Sequence (int size) { manyItems = 0; data = new int[size]; currentIndex = manyItems; } containers

  35. Member function implementations // size method returns count of Items in List public int size () { return manyItems; } containers

  36. Member function implementations // start method -- places cursor at start of List public void start( ) { currentIndex = 0; } containers

  37. Member function implementations // getCurrent method returns value of current Item public int getCurrent() { try { isCurrent() == true; } catch (Exception e) { System.err.print (“Error – no current item”); System.exit(1); } return data[currentIndex]; } containers

  38. Member function implementations // advance method moves to next position in List public void advance( ) { currentIndex++; } containers

  39. Member function implementations public boolean isCurrent() { if (currentIndex < manyItems) return true; return false; } containers

  40. Member function implementations // addBefore method-- add item in front of current item public void addBefore(int entry) { if (size( ) >= manyItems) ensureCapacity((manyItems +1)*2); if(!isCurrent()) { for (int x=manyItems; x>0; x--) data[x]=data[x-1]; start(); } containers

  41. Continuation of insert() // make room for new Item from current_index on // if valid Item exists else for (int n=manItems; n>currentIndex; n--) data[n] = data[n-1]; // add new entry data[currentIndex] = entry; // restore invariant manyItems++; } containers

  42. Member function implementations // addAfter method-- add entry after current Item public void addAfter(int entry) { int n; if (size() <= manyItems) ensureCapacity((manyItems+1)*2); // make room for new entry for (n=manyItems; n>currentIndex+1; n--) data[n] = data[n-1]; // add new entry data[n] = entry; // restore invariant currentIndex = n; manyItems++; } containers

  43. Member function implementations // removeCurrent -- delete current Item from List public void removeCurrent( ) { if (isCurrent( )) { // erase current value by over-writing it for (int n=currentIndex; n<manyItems-1; n++) data[n] = data[n+1]; // restore invariant manyItems--; } } containers

  44. Container Classes Bags & Sequences containers

More Related