00001 package ca.mcgill.sable.util;
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027
00028
00029
00030
00031
00032
00033
00034
00035
00036
00037
00038
00039
00040
00041
00042
00043
00044
00045
00046
00047
00048
00049
00050
00051
00052
00053
00054
00055
00056
00057
00058
00059
00060
00061
00062
00063
00064
00065
00066
00067
00068
00069
00070
00071
00072
00073
00074
00075
00076
00077
00078
00079
00080 public class ArraySet extends AbstractSet
00081 {
00082 private static final int DEFAULT_SIZE = 8;
00083
00084 private int numElements;
00085 private int maxElements;
00086 private Object[] elements;
00087
00088 private class ArrayIterator implements Iterator
00089 {
00090 int nextIndex;
00091
00092 ArrayIterator()
00093 {
00094 nextIndex = 0;
00095 }
00096
00097 public boolean hasNext()
00098 {
00099 return nextIndex < numElements;
00100 }
00101
00102 public Object next() throws NoSuchElementException
00103 {
00104 if(!(nextIndex < numElements))
00105 throw new NoSuchElementException();
00106
00107 return elements[nextIndex++];
00108 }
00109
00110 public void remove() throws NoSuchElementException
00111 {
00112 if(nextIndex == 0)
00113 throw new NoSuchElementException();
00114 else
00115 {
00116 removeElementAt(nextIndex - 1);
00117 nextIndex = nextIndex - 1;
00118 }
00119 }
00120 }
00121
00122 public ArraySet()
00123 {
00124 maxElements = DEFAULT_SIZE;
00125 elements = new Object[DEFAULT_SIZE];
00126 numElements = 0;
00127 }
00128
00129
00130
00131
00132 public ArraySet(Object[] elements)
00133 {
00134 this();
00135
00136 for(int i = 0; i < elements.length; i++)
00137 add(elements[i]);
00138 }
00139 public boolean add(Object e)
00140 {
00141 if(contains(e))
00142 return false;
00143 else
00144 {
00145
00146 if(numElements == maxElements)
00147 doubleCapacity();
00148
00149
00150 elements[numElements++] = e;
00151 return true;
00152 }
00153 }
00154 public void clear()
00155 {
00156 numElements = 0;
00157 }
00158 public boolean contains(Object obj)
00159 {
00160 for(int i = 0; i < numElements; i++)
00161 if(elements[i].equals(obj))
00162 return true;
00163
00164 return false;
00165 }
00166 private void doubleCapacity()
00167 {
00168 int newSize = maxElements * 2;
00169
00170 Object[] newElements = new Object[newSize];
00171
00172 System.arraycopy(elements, 0, newElements, 0, numElements);
00173 elements = newElements;
00174 maxElements = newSize;
00175 }
00176 public Iterator iterator()
00177 {
00178 return new ArrayIterator();
00179 }
00180 private void removeElementAt(int index)
00181 {
00182
00183 if(index == numElements - 1)
00184 {
00185 numElements--;
00186 return;
00187 }
00188
00189
00190 System.arraycopy(elements, index + 1, elements, index, numElements - (index + 1));
00191 numElements--;
00192 }
00193 public int size()
00194 {
00195 return numElements;
00196 }
00197 public Object[] toArray()
00198 {
00199 Object[] array = new Object[numElements];
00200
00201 System.arraycopy(elements, 0, array, 0, numElements);
00202 return array;
00203 }
00204 public void toArray(Object[] array)
00205 {
00206 System.arraycopy(elements, 0, array, 0, numElements);
00207 }
00208 }