import java.util.Collection; import java.util.Iterator; /** * A class to provide a simple list. * List resizes automatically. Used to illustrate * various design and implementation details of * a class in Java. * * @author scottm * */ public class GenericListVersion2 implements Iterable{ // class constant for default size private static final int DEFAULT_CAP = 10; //instance variables // iValues store the elements of the list and // may have extra capacity private Object[] iValues; private int iSize; private class GenericListIterator implements Iterator{ private int position; private boolean removeOK; private GenericListIterator(){ position = 0; removeOK = false; } public boolean hasNext(){ return position < iSize; } public Object next(){ Object result = iValues[position]; position++; removeOK = true; return result; } public void remove(){ if( !removeOK ) throw new IllegalStateException(); // which element should be removed?? removeOK = false; GenericListVersion2.this.remove(position - 1); position--; } } public Iterator iterator(){ return new GenericListIterator(); } public void addAll(Collection c){ // for each loop for(Object obj : c){ this.add(obj); } } /** * Default add method. Add x to the end of this IntList. * Size of the list goes up by 1. * @param x The value to add to the end of this list. */ public void add(Object x){ insert(iSize, x); } public Object get(int pos){ return iValues[pos]; } /** * Insert obj at position pos. * post: get(pos) = x, size() = old size() + 1 * @param pos 0 <= pos <= size() * @param obj The element to add. */ public void insert(int pos, Object obj){ ensureCapcity(); for(int i = iSize; i > pos; i--){ iValues[i] = iValues[i - 1]; } iValues[pos] = obj; iSize++; } public Object remove(int pos){ Object removedValue = iValues[pos]; for(int i = pos; i < iSize - 1; i++) iValues[i] = iValues[i + 1]; iValues[iSize - 1] = null; iSize--; return removedValue; } private void ensureCapcity(){ // is there extra capacity available? // if not, resize if(iSize == iValues.length) resize(); } public int size(){ return iSize; } // resize internal storage container by a factor of 2 private void resize() { Object[] temp = new Object[iValues.length * 2]; System.arraycopy(iValues, 0, temp, 0, iValues.length); iValues = temp; } /** * Return a String version of this list. Size and * elements included. */ public String toString(){ // we could make this more effecient by using a StringBuffer. // See alternative version String result = "size: " + iSize + ", elements: ["; for(int i = 0; i < iSize - 1; i++) result += iValues[i].toString() + ", "; if(iSize > 0 ) result += iValues[iSize - 1]; result += "]"; return result; } // Would not really have this and toString available // both included just for testing public String toStringUsingStringBuffer(){ StringBuffer result = new StringBuffer(); result.append( "size: " ); result.append( iSize ); result.append(", elements: ["); for(int i = 0; i < iSize - 1; i++){ result.append(iValues[i]); result.append(", "); } if( iSize > 0 ) result.append(iValues[iSize - 1]); result.append("]"); return result.toString(); } /** * Default constructor. Creates an empty list. */ public GenericListVersion2(){ //redirect to single int constructor this(DEFAULT_CAP); //other statments could go here. } /** * Constructor to allow user of class to specify * initial capacity in case they intend to add a lot * of elements to new list. Creates an empty list. * @param initialCap > 0 */ public GenericListVersion2(int initialCap) { assert initialCap > 0 : "Violation of precondition. IntListVer1(int initialCap):" + "initialCap must be greater than 0. Value of initialCap: " + initialCap; iValues = new Object[initialCap]; iSize = 0; } /** * Return true if this IntList is equal to other.
* pre: none * @param other The object to comapre to this * @return true if other is a non null, IntList object * that is the same size as this IntList and has the * same elements in the same order, false otherwise. */ public boolean equals(Object other){ boolean result; if(other == null) // we know this is not null so can't be equal result = false; else if(this == other) // quick check if this and other refer to same IntList object result = true; else if( this.getClass() != other.getClass() ) // other is not an IntList they can't be equal result = false; else{ // other is not null and refers to an IntList GenericListVersion2 otherList = (GenericListVersion2)other; result = this.size() == otherList.size(); int i = 0; while(i < iSize && result){ result = this.iValues[i].equals( otherList.iValues[i] ); i++; } } return result; } }