Back to index

wims  3.65+svn20090927
MyVector.java
Go to the documentation of this file.
00001 package rene.util;
00002 
00003 import java.util.Enumeration;
00004 
00025 public class MyVector
00026        implements Enumeration
00027 {      Object O[];
00028        int OSize,ON,OLast,Gap;
00029        int EN=0;
00030        
00031        public MyVector (int initsize)
00032        {      O=new Object[initsize];
00033               OSize=initsize;
00034               OLast=ON=0;
00035               Gap=-1;
00036        }
00037        public MyVector ()
00038        {      this(8);
00039        }
00040 
00044        public void addElement (Object o)
00045        {      if (OLast>=OSize) extend();
00046               O[OLast++]=o;
00047               ON++;
00048        }
00049        
00053        public void extend ()
00054        {      if (ON<OLast/2)
00055               {      compress(); return;
00056               }
00057               Object o[]=new Object[2*OSize];
00058               System.arraycopy(O,0,o,0,OLast);
00059               OSize*=2;
00060               O=o;
00061        }
00062        
00066        public void compress ()
00067        {      if (Gap<0) return;
00068               int k=Gap;
00069               for (int i=Gap; i<OLast; i++)
00070               {      if (O[i]==null) continue;
00071                      O[k++]=O[i];
00072               }
00073               ON=k;
00074               for (int i=k; i<OLast; i++) O[i]=null;
00075               Gap=-1; OLast=ON;
00076        }
00077        
00081        public Enumeration elements ()
00082        {      compress(); EN=0;
00083               return this;
00084        }
00085 
00089        public boolean hasMoreElements ()
00090        {      while (EN<OLast && O[EN]==null) EN++;
00091               return EN<OLast;
00092        }
00093        
00097        public Object nextElement ()
00098        {      if (!hasMoreElements())
00099                      throw new ArrayIndexOutOfBoundsException(OLast);
00100               return O[EN++];
00101        }
00102 
00106        public void removeAllElements ()
00107        {      for (int i=0; i<OLast; i++) O[i]=null;
00108               ON=OLast=0; Gap=-1;
00109        }
00110        
00115        public void removeElement (Object o)
00116        {      int i=indexOf(o);
00117               if (i<0) return;
00118               O[i]=null; ON--;
00119               if (Gap<0 || Gap>i) Gap=i;
00120               if (i==OLast-1) OLast--;
00121               while (OLast>0 && O[OLast-1]==null) OLast--;
00122               if (Gap>=OLast) Gap=-1;
00123        }
00124        
00131        public int indexOf (Object o)
00132        {      if (EN>0 && EN<=OLast && O[EN-1].equals(o)) return EN-1;
00133               if (Gap<0)
00134               {      for (int i=0; i<OLast; i++)
00135                      {      if (O[i].equals(o)) return i;
00136                      }
00137                      return -1;
00138               }
00139               for (int i=0; i<Gap; i++)
00140               {      if (O[i].equals(o)) return i;
00141               }
00142               int k=Gap;
00143               for (int i=Gap; i<OLast; i++)
00144               {      if (O[i]==null) continue;
00145                      if (O[i].equals(o))
00146                      {      Gap=k;
00147                             return i;
00148                      }
00149                      O[k++]=O[i]; O[i]=null;
00150               }
00151               ON=k;
00152               for (int i=k; i<OLast; i++) O[i]=null;
00153               Gap=-1; OLast=ON;
00154               return -1;
00155        }
00156        
00160        public int size ()
00161        {      return ON;
00162        }
00163        
00169        public Object elementAt (int n)
00170        {      if (n<0 || n>=ON)
00171                      throw new ArrayIndexOutOfBoundsException(n);
00172               if (Gap<0 || n<Gap) return O[n];
00173               int k=Gap;
00174               for (int i=Gap; i<OLast; i++)
00175               {      if (O[i]==null) continue;
00176                      O[k]=O[i]; O[i]=null;
00177                      if (k==n)
00178                      {      Object ret=O[k];
00179                             k++; Gap=k;
00180                             if (Gap>=ON)
00181                             {      for (int j=Gap; j<OLast; j++) O[j]=null;
00182                                    OLast=ON; Gap=-1;
00183                             }
00184                             return ret;
00185                      }
00186                      k++;
00187               }
00188               // never happens
00189               throw new ArrayIndexOutOfBoundsException(n); 
00190        }
00191        
00197        public Object[] getArray ()
00198        {      compress();
00199               return O;
00200        }
00201        
00205        public void copyInto (Object o[])
00206        {      compress();
00207               System.arraycopy(O,0,o,0,ON);
00208        }
00209 
00213        public boolean equals (MyVector V)
00214        {      if (V.ON!=ON) return false;
00215               V.compress(); compress();
00216               for (int i=0; i<ON; i++)
00217               {      if (!V.O[i].equals(O[i])) return false;
00218               }
00219               return true;
00220        }
00221        
00225        public boolean equalsIdentical (MyVector V)
00226        {      if (V.ON!=ON) return false;
00227               V.compress(); compress();
00228               for (int i=0; i<ON; i++)
00229               {      if (V.O[i]!=O[i]) return false;
00230               }
00231               return true;
00232        }
00233        
00237        public void truncate (int n)
00238        {      if (n>=ON) return;
00239               compress();
00240               for (int i=n; i<OLast; i++) O[i]=null;
00241               OLast=ON=n;
00242        }
00243        
00244        public static void main (String args[])
00245        {      MyVector V=new MyVector();
00246               for (int i=1; i<=10; i++)
00247                      V.addElement("Element "+i);
00248               for (int i=4; i<=9; i++)
00249                      V.removeElement("Element "+i);
00250               System.out.println("--> "+V.elementAt(3));
00251               System.out.println(V.ON+" elements, "+V.OLast+" used, "+V.Gap+" gap.");
00252               System.out.println("--> "+V.elementAt(3));
00253               System.out.println(V.ON+" elements, "+V.OLast+" used, "+V.Gap+" gap.");
00254               for (int i=11; i<=20; i++)
00255                      V.addElement("Element "+i);
00256               System.out.println(V.ON+" elements, "+V.OLast+" used ,"+V.Gap+" gap.");
00257               Enumeration E=V.elements();
00258               while (E.hasMoreElements())
00259               {      System.out.println((String)E.nextElement());
00260               }
00261               System.out.println(V.ON+" elements, "+V.OLast+" used, "+V.Gap+" gap.");
00262        }
00263 }