1 33 package net.sf.jga.algorithms; 34 35 import java.util.Collection ; 36 import java.util.Comparator ; 37 import java.util.Iterator ; 38 import java.util.NoSuchElementException ; 39 import net.sf.jga.fn.BinaryFunctor; 40 import net.sf.jga.fn.adaptor.ConstantBinary; 41 import net.sf.jga.fn.comparison.LessEqual; 42 import net.sf.jga.util.CollectionUtils; 43 import net.sf.jga.util.ComparableComparator; 44 import net.sf.jga.util.LookAheadIterator; 45 46 import static net.sf.jga.util.ArrayUtils.*; 47 48 54 55 public class Merge { 56 57 61 64 static public <T> Iterable <T> append(T[] ts1, T[] ts2) { 65 return new MergeIterable<T>(iterable(ts1), iterable(ts2), 66 new ConstantBinary<T,T,Boolean >(Boolean.TRUE)); 67 } 68 69 70 73 static public <T extends Comparable <? super T>> Iterable <T> merge(T[] ts1, T[] ts2) { 74 return new MergeIterable<T>(iterable(ts1), iterable(ts2), new ComparableComparator<T>()); 75 } 76 77 78 82 static public <T> Iterable <T> merge(T[] ts1, T[] ts2, Comparator <T> comp) { 83 return new MergeIterable<T>(iterable(ts1), iterable(ts2), comp); 84 } 85 86 87 92 static public <T> Iterable <T> merge(T[] ts1, T[] ts2, BinaryFunctor<T,T,Boolean > pred){ 93 return new MergeIterable<T>(iterable(ts1), iterable(ts2), pred); 94 } 95 96 97 101 105 static public <T> Iterable <T> append(Iterable <? extends T> i1, Iterable <? extends T> i2) { 106 return merge(i1, i2, new ConstantBinary<T,T,Boolean >(Boolean.TRUE)); 107 } 108 109 110 114 static public <T extends Comparable <? super T>> Iterable <T> 115 merge(Iterable <? extends T> i1, Iterable <? extends T> i2) 116 { 117 return merge(i1, i2, new ComparableComparator<T>()); 118 } 119 120 121 125 static public <T> Iterable <T> 126 merge(Iterable <? extends T> i1, Iterable <? extends T> i2, Comparator <T> comp) 127 { 128 return new MergeIterable<T>(i1, i2, comp); 129 } 130 131 132 137 static public <T> Iterable <T> 138 merge(Iterable <? extends T> i1, Iterable <? extends T> i2, BinaryFunctor<T,T,Boolean > pred) 139 { 140 return new MergeIterable<T>(i1, i2, pred); 141 } 142 143 147 151 static public <T> Iterator <T> append(Iterator <? extends T> iter1, Iterator <? extends T> iter2) { 152 return new net.sf.jga.util.MergeIterator<T>(iter1, iter2, 153 new ConstantBinary<T,T,Boolean >(Boolean.TRUE)); 154 } 155 156 157 161 static public <T extends Comparable <? super T>> Iterator <T> 162 merge(Iterator <? extends T> iter1, Iterator <? extends T> iter2) { 163 return new net.sf.jga.util.MergeIterator<T>(iter1, iter2, new ComparableComparator<T>()); 164 } 165 166 167 172 static public <T> Iterator <T> 173 merge(Iterator <? extends T> iter1, Iterator <? extends T> iter2, Comparator <T> comp) { 174 return new net.sf.jga.util.MergeIterator<T>(iter1,iter2,comp); 175 } 176 177 178 184 static public <T> Iterator <T> 185 merge(Iterator <? extends T> iter1, Iterator <? extends T> iter2, BinaryFunctor<T,T,Boolean > pred){ 186 return new net.sf.jga.util.MergeIterator<T>(iter1,iter2,pred); 187 } 188 189 193 197 static public <T, TCollection extends Collection <? super T>> TCollection 198 append(Iterable <? extends T> cin1, Iterable <? extends T> cin2, TCollection cout) { 199 return merge(cin1, cin2, new ConstantBinary<T,T,Boolean >(Boolean.TRUE), cout); 200 } 201 202 203 207 static public <T extends Comparable <? super T>, TCollection extends Collection <? super T>> TCollection 208 merge(Iterable <? extends T> cin1, Iterable <? extends T> cin2, TCollection cout) { 209 return merge(cin1, cin2, new ComparableComparator<T>(), cout); 210 } 211 212 213 217 static public <T, TCollection extends Collection <? super T>> TCollection 218 merge(Iterable <? extends T> cin1, Iterable <? extends T> cin2, Comparator <T> comp, 219 TCollection cout) 220 { 221 return CollectionUtils.append(cout, merge(cin1.iterator(), cin2.iterator(), comp)); 222 } 223 224 225 229 230 static public <T, TCollection extends Collection <? super T>> TCollection 231 merge(Iterable <? extends T> cin1, Iterable <? extends T> cin2, BinaryFunctor<T,T,Boolean > pred, 232 TCollection cout) 233 { 234 return CollectionUtils.append(cout, merge(cin1.iterator(), cin2.iterator(), pred)); 235 } 236 237 238 241 static public class MergeIterable<T> implements Iterable <T> { 242 243 private Iterable <? extends T> _delegate1; 245 private Iterable <? extends T> _delegate2; 246 247 private BinaryFunctor<T,T,Boolean > _pred; 249 250 255 256 public MergeIterable(Iterable <? extends T> base1, Iterable <? extends T> base2, 257 Comparator <T> comp) 258 { 259 this(base1, base2, new LessEqual<T>(comp)); 260 } 261 262 268 269 public MergeIterable(Iterable <? extends T> base1, Iterable <? extends T> base2, 270 BinaryFunctor<T,T,Boolean > pred) 271 { 272 if (base1 == null || base2 == null) { 273 String msg = "two base iterables are required"; 274 throw new IllegalArgumentException (msg); 275 } 276 277 if (pred == null) { 278 String msg = "functor is required"; 279 throw new IllegalArgumentException (msg); 280 } 281 282 _delegate1 = base1; 283 _delegate2 = base2; 284 _pred = pred; 285 } 286 287 291 public Iterator <T> iterator() { 292 return new net.sf.jga.util.MergeIterator<T>(_delegate1.iterator(), 293 _delegate2.iterator(), _pred); 294 } 295 } 296 297 300 static public class MergeIterator<T> implements Iterator <T> { 301 private LookAheadIterator<? extends T> _base1; 303 private LookAheadIterator<? extends T> _base2; 304 305 private BinaryFunctor<T,T,Boolean > _pred; 307 308 314 315 public MergeIterator(Iterator <? extends T> base1, Iterator <? extends T> base2, 316 Comparator <T> comp) 317 { 318 this(base1, base2, new LessEqual<T>(comp)); 319 } 320 321 327 328 public MergeIterator(Iterator <? extends T> base1, Iterator <? extends T> base2, 329 BinaryFunctor<T,T,Boolean > pred) 330 { 331 if (base1 == null || base2 == null) { 332 String msg = "two base iterators are required"; 333 throw new IllegalArgumentException (msg); 334 } 335 if (pred == null) { 336 String msg = "functor is required"; 337 throw new IllegalArgumentException (msg); 338 } 339 340 _base1 = new LookAheadIterator<T>(base1, 1); 341 _base2 = new LookAheadIterator<T>(base2, 1); 342 _pred = pred; 343 } 344 345 346 350 public boolean hasNext() { 351 return _base1.hasNextPlus(1) || _base2.hasNextPlus(1); 352 } 353 354 public T next() { 355 if (_base1.hasNextPlus(1)) 356 if (_base2.hasNextPlus(1)) 357 if (_pred.fn(_base1.peek(1), _base2.peek(1))) 358 return _base1.next(); 359 else 360 return _base2.next(); 361 else 362 return _base1.next(); 363 else 364 if (_base2.hasNextPlus(1)) 365 return _base2.next(); 366 else 367 throw new NoSuchElementException (); 368 } 369 370 public void remove() { throw new UnsupportedOperationException (); } 371 } 372 } 373 | Popular Tags |