CSE143 IntList Code handout #34 Interface Iterator<E> from java.util ------------------------------------ public interface Iterator<E> { public boolean hasNext(); public E next(); public void remove(); } Interface Iterable<E> from java.lang ------------------------------------ public interface Iterable<E> { public Iterator<E> iterator(); } Interface IntList.java ---------------------- // The IntList interface defines a set of operations for an ordered collection // (sequence) of integers. public interface IntList extends Iterable<Integer> { public int size(); public int get(int index); public int indexOf(int value); public boolean isEmpty(); public boolean contains(int value); public void add(int value); public void add(int index, int value); public void addAll(IntList other); public void remove(int index); public void removeAll(IntList other); public void set(int index, int value); public void clear(); } Class AbstractIntList.java -------------------------- // AbstractIntList provides a skeletal implementation of the IntList class. // Many operations are defined in terms of the list iterator. Subclasses // need to define size(), get(int index), add(int value), add(index, value), // remove(index), set(index, value), clear(), ensureCapacity() and iterator(). import java.util.*; public abstract class AbstractIntList implements IntList { // post: returns a comma-separated, bracketed version of the list public String toString() { Iterator<Integer> i = iterator(); String result = "["; if (i.hasNext()) { result += i.next(); while (i.hasNext()) result += ", " + i.next(); } result += "]"; return result; } // post : returns the position of the first occurence of the given // value (-1 if not found) public int indexOf(int value) { int index = 0; for (int i : this) { if (i == value) return index; index++; } return -1; } // post: returns true if list is empty, false otherwise public boolean isEmpty() { return !iterator().hasNext(); } // post: returns true if the given value is contained in the list, // false otherwise public boolean contains(int value) { return indexOf(value) != -1; } // post: appends all values in the given list to the end of this list public void addAll(IntList other) { for (int i : other) add(i); } // post: removes all occurrences of the values in the given list from // this list public void removeAll(IntList other) { Iterator<Integer> i = iterator(); while (i.hasNext()) if (other.contains(i.next())) i.remove(); } // post: throws an exception if the given index is out of range protected void checkIndex(int index) { if (index < 0 || index >= size()) throw new IndexOutOfBoundsException("illegal index: " + index); } } Class ArrayIntList.java ----------------------- import java.util.*; public class ArrayIntList extends AbstractIntList { private int[] elementData; // list of integers private int size; // current number of elements in the list public static final int DEFAULT_CAPACITY = 100; // post: constructs an empty list of default capacity public ArrayIntList() { this(DEFAULT_CAPACITY); } // pre : capacity >= 0 // post: constructs an empty list with the given capacity public ArrayIntList(int capacity) { if (capacity < 0) throw new IllegalArgumentException("negative capacity"); elementData = new int[capacity]; size = 0; } // post: returns the current number of elements in the list public int size() { return size; } // pre : 0 <= index < size() // post: returns the integer at the given index in the list public int get(int index) { checkIndex(index); return elementData[index]; } // post: appends the given value to the end of the list public void add(int value) { ensureCapacity(size + 1); elementData[size] = value; size++; } // pre: 0 <= index <= size() // post: inserts the given value at the given index, shifting subsequent // values right public void add(int index, int value) { ensureCapacity(size + 1); for (int i = size; i > index; i--) elementData[i] = elementData[i - 1]; elementData[index] = value; size++; } // pre : 0 <= index < size() // post: removes value at the given index, shifting subsequent values left public void remove(int index) { checkIndex(index); for (int i = index; i < size - 1; i++) elementData[i] = elementData[i + 1]; size--; } public void set(int index, int value) { checkIndex(index); elementData[index] = value; } public void clear() { size = 0; } public void ensureCapacity(int capacity) { if (capacity > elementData.length) { int newCapacity = elementData.length * 2 + 1; if (capacity > newCapacity) newCapacity = capacity; int[] newList = new int[newCapacity]; for (int i = 0; i < size; i++) newList[i] = elementData[i]; elementData = newList; } } public Iterator<Integer> iterator() { return new ArrayIterator(); } private class ArrayIterator implements Iterator<Integer> { private int position; // current position within the list private boolean removeOK; // whether it's okay to remove now // post: constructs an iterator for the given list public ArrayIterator() { position = 0; removeOK = false; } public boolean hasNext() { return position < size(); } public Integer next() { if (!hasNext()) throw new NoSuchElementException(); int result = get(position); position++; removeOK = true; return result; } public void remove() { if (!removeOK) throw new IllegalStateException(); ArrayIntList.this.remove(position - 1); position--; removeOK = false; } } }
Stuart Reges
Last modified: Mon Jun 2 15:41:04 PDT 2008