1 10 package org.mmbase.util; 11 12 import java.util.Vector ; 13 import java.util.Enumeration ; 14 import org.mmbase.util.logging.*; 15 16 28 public class SortedVector extends java.util.Vector { 29 30 private static Logger log = Logging.getLoggerInstance(SortedVector.class.getName()); 32 33 CompareInterface cmp=null; 34 CompareInterface sortcmp=new SortableCompare(); 35 CompareInterface stringcmp=new StringCompare(); 36 37 40 public SortedVector() { 41 super(); 42 } 43 44 48 public SortedVector(CompareInterface cmp) { 49 super(); 50 this.cmp=cmp; 51 } 52 53 58 public void addSorted(Object newObject) { 59 if (cmp==null) cmp=stringcmp; 61 if (size()>16) { addBinSorted(newObject); 63 } else { 64 addLinSorted(newObject); 65 } 66 } 67 68 73 public void addSorted(Sortable newObject) { 74 if (cmp==null) cmp=sortcmp; 75 if (size()>16) { addBinSorted(newObject); 77 } else { 78 addLinSorted(newObject); 79 } 80 } 81 82 86 public void addUniqueSorted(Object newObject) { 87 int low,med,high,which=0; 88 boolean done; 89 90 med=0; 91 done=false; 92 Object other; 93 94 for (low=0,high=size()-1;low<=high && !done; ) { 95 med=(low+high)/2; 96 other=elementAt(med); 97 which=cmp.compare(newObject,other); 98 if (which<0) { 99 high=med-1; 100 } else if (which>0) { 101 low=med+1; 102 med=low; 103 } else { 104 done=true; 105 } 106 } 107 if (!done) 108 insertElementAt(newObject,med); 109 } 110 111 115 public void addLinSorted(Object newObject) { 116 Enumeration e = elements(); 117 boolean done = false; 118 int i = 0; 119 120 Object other; 121 122 while (e.hasMoreElements() && !done) { other = e.nextElement(); 124 if (cmp.compare(newObject,other)<0) { insertElementAt(newObject,i); 126 done = true; 127 } 128 i++; 129 } 130 if (!done) { 131 addElement(newObject); 132 } 133 } 134 135 139 public void addBinSorted(Object newObject) { 140 int low,med,high,which=0; 141 boolean done; 142 143 med=0; 144 done=false; 145 Object other; 146 147 for (low=0,high=size()-1;low<=high && !done; ) { 148 med=(low+high)/2; 149 other=elementAt(med); 150 which=cmp.compare(newObject,other); 151 if (which<0) { 152 high=med-1; 153 } else if (which>0) { 154 low=med+1; 155 med=low; 156 } else { 157 done=true; 158 } 159 } 160 insertElementAt(newObject,med); 161 } 162 163 168 public boolean has(Object newObject) { 169 return find(newObject)>=0; 170 } 171 172 179 public int find(Object newObject) { 180 int low,med,high,which=0; 181 boolean done; 182 183 med=0; 184 done=false; 185 Object other; 186 187 for (low=0,high=size()-1;low<=high && !done; ) { 188 med=(low+high)/2; 189 other=elementAt(med); 190 which=cmp.compare(newObject,other); 191 if (which<0) { 192 high=med-1; 193 } else if (which>0) { 194 low=med+1; 195 med=low; 196 } else { 197 done=true; 198 } 199 } 200 if (done) return med; 201 else return -1; 202 } 203 204 208 public void setCompare(CompareInterface cmp) { 209 this.cmp=cmp; 210 Sort(); 211 } 212 213 216 public void Sort() { 217 if (size()>1) { 218 if (cmp==null) { 219 if (firstElement() instanceof String ) { 220 cmp=stringcmp; 221 } else { 222 cmp=sortcmp; 223 } 224 } 225 qsortCompare(0,size()-1); 226 } 227 } 228 229 232 private void qsortCompare(int first,int last ) { 233 Object x; 234 int left=first+1; 235 int right=last; 236 237 238 if (last-first+1<2) return; 239 loop: 240 while(left<right) { 241 while(cmp.compare(elementAt(left),elementAt(first))<=0) { 242 left++; 243 if (left>=right) break loop; 244 } 245 while(cmp.compare(elementAt(right),elementAt(first))>0) { 246 right--; 247 if (left>=right) break loop; 248 } 249 250 x=elementAt(left); 251 setElementAt(elementAt(right),left); 252 setElementAt(x,right); 253 left++; 254 } 255 if (cmp.compare(elementAt(first),elementAt(left))<0) { 256 left--; 257 } 258 x=elementAt(left); 259 setElementAt(elementAt(first),left); 260 setElementAt(x,first); 261 qsortCompare(first,left-1); 262 qsortCompare(left+1,last); 263 } 264 265 271 public static SortedVector SortVector(Vector vec) { 272 SortedVector newvec=new SortedVector(); 273 274 for (Enumeration e=vec.elements();e.hasMoreElements();) { 275 newvec.addElement(e.nextElement()); 276 } 277 newvec.Sort(); 278 return newvec; 279 } 280 281 285 public static SortedVector SortVector(Vector vec,CompareInterface cmpI) { 286 SortedVector newvec=new SortedVector(cmpI); 287 288 for (Enumeration e=vec.elements();e.hasMoreElements();) { 289 newvec.addElement(e.nextElement()); 290 } 291 newvec.Sort(); 292 return newvec; 293 } 294 295 298 public static void main(String args[]) { 299 SortedVector v; 300 Vector vec=new Vector (); 301 StringCompare strc=new StringCompare(); 302 303 304 v=new SortedVector(strc); 305 for (int i=0;i<args.length;i++) { 306 v.addBinSorted(args[i]); 307 log.info("V "+v); 308 } 309 310 log.info("Element "+args[0]+" at "+v.find(args[0])+" : "+v.has(args[0])); 311 312 313 for (int i=0;i<args.length;i++) { 314 vec.addElement(args[i]); 315 } 316 log.info("V1 "+vec); 317 log.info("V2 "+SortVector(vec)); 318 319 320 321 v=new SortedVector(strc); 322 for (int i=0;i<args.length;i++) { 323 v.addElement(args[i]); 324 } 325 log.info("V1 "+vec); 326 log.info("V2 "+SortVector(vec)); 327 } 328 329 } 330 | Popular Tags |