1 33 package net.sf.jga.algorithms; 34 35 import java.util.Arrays ; 36 import java.util.Collection ; 37 import java.util.Comparator ; 38 import java.util.Iterator ; 39 import java.util.NoSuchElementException ; 40 import net.sf.jga.fn.BinaryFunctor; 41 import net.sf.jga.fn.UnaryFunctor; 42 import net.sf.jga.fn.algorithm.ElementOf; 43 import net.sf.jga.fn.comparison.EqualTo; 44 import net.sf.jga.fn.comparison.Equality; 45 import net.sf.jga.fn.comparison.NotEqualTo; 46 import net.sf.jga.util.EmptyIterator; 47 import net.sf.jga.util.FindIterator; 48 import net.sf.jga.util.LookAheadIterator; 49 50 import static net.sf.jga.fn.comparison.ComparisonFunctors.*; 51 import static net.sf.jga.util.ArrayUtils.*; 52 53 57 58 public class Find { 59 60 64 70 static public <T> Iterator <T> find(T[] ts, T value) { 71 return find(iterate(ts), equalTo(value)); 72 } 73 74 80 static public <T> Iterator <T> find(T[] ts, T value, Comparator <? super T> comp){ 81 return find(iterate(ts), equalTo(comp, value)); 82 } 83 84 85 91 static public <T> Iterator <T> find(T[] ts, T value, Equality<T> eq){ 92 return find(iterate(ts), equalTo(eq, value)); 93 } 94 95 96 102 static public <T> Iterator <T> find(T[] ts, UnaryFunctor<T,Boolean > fn) { 103 return find(iterate(ts), fn); 104 } 105 106 112 static public <T> Iterator <T> findElement(T[] ts, T[] values) { 113 return find(iterate(ts), elementOf(values)); 114 } 115 116 117 124 static public <T> Iterator <T> findElement(T[] ts, Collection <? extends T> values) { 125 return find(iterate(ts), elementOf(values) ); 126 } 127 128 135 static public <T> Iterator <T> findElement(T[] ts, T[] values, Comparator <? super T> comp) { 136 return find(iterate(ts), elementOf(values, comp)); 137 } 138 139 140 147 static public <T> Iterator <T> 148 findElement(T[] ts, Collection <? extends T> values, Comparator <? super T> comp) { 149 return find(iterate(ts), elementOf(values, comp)); 150 } 151 152 159 static public <T> Iterator <T> findElement(T[] ts, T[] values, BinaryFunctor<T,T,Boolean > bf) { 160 return find(iterate(ts), elementOf(values, bf)); 161 } 162 163 164 171 static public <T> Iterator <T> 172 findElement(T[] ts, Collection <? extends T> values, BinaryFunctor<T,T,Boolean > bf) { 173 return find(iterate(ts), elementOf(values, bf)); 174 } 175 176 177 184 static public <T> Iterator <T> findAdjacent(T[] ts) { 185 return findAdjacent(iterate(ts), new EqualTo<T>()); 186 } 187 188 189 196 static public <T> Iterator <T> findAdjacent(T[] ts, Comparator <? super T> comp) { 197 return findAdjacent(iterate(ts), new EqualTo<T>(comp)); 198 } 199 200 201 209 static public <T> Iterator <T> findAdjacent(T[] ts, BinaryFunctor<T,T,Boolean > eq) { 210 return findAdjacent(iterate(ts), eq); 211 } 212 213 214 221 static public <T> Iterator <T> findRepeated (T[] ts, int count, T value) { 222 return findRepeated(iterate(ts), count, equalTo(value)); 223 } 224 225 233 static public <T> Iterator <T> 234 findRepeated (T[] ts, int count, T value, Comparator <? super T> comp) { 235 return findRepeated(iterate(ts), count, equalTo(comp, value)); 236 } 237 238 246 static public <T> Iterator <T> findRepeated (T[] ts, int count, T value, Equality<T> eq) { 247 return findRepeated(iterate(ts), count, equalTo(eq, value)); 248 } 249 250 259 static public <T> Iterator <T> findRepeated (T[] ts, int count, UnaryFunctor<T,Boolean > eq) { 260 return findRepeated(iterate(ts), count, eq); 261 } 262 263 269 static public <T> Iterator <T> findSequence(T[] ts, T[] pattern) { 270 return findSequence(iterate(ts), Arrays.asList(pattern), new EqualTo<T>()); 271 } 272 273 274 280 static public <T> Iterator <T> findSequence(T[] ts, Collection <? extends T> pattern) { 281 return findSequence(iterate(ts), pattern, new EqualTo<T>()); 282 } 283 284 285 291 static public <T> Iterator <T> findSequence(T[] ts, T[] pattern, Comparator <? super T> comp) { 292 return findSequence(iterate(ts), Arrays.asList(pattern), new EqualTo<T>(comp)); 293 } 294 295 296 302 static public <T> Iterator <T> 303 findSequence(T[] ts, Collection <? extends T> pattern, Comparator <T> comp) { 304 return findSequence(iterate(ts), pattern, new EqualTo<T>(comp)); 305 } 306 307 308 314 static public <T> Iterator <T> findSequence(T[] ts, T[] pattern, BinaryFunctor<T,T,Boolean > fn) { 315 return findSequence(iterate(ts), Arrays.asList(pattern), fn); 316 } 317 318 319 325 static public <T> Iterator <T> 326 findSequence(T[] ts, Collection <? extends T> pattern, BinaryFunctor<T,T,Boolean > fn) { 327 return findSequence(iterate(ts), pattern, fn); 328 } 329 330 331 339 static public <T> Iterator <T> findMismatch(T[] ts, T[] pattern){ 340 return findMismatch(iterate(ts), Arrays.asList(pattern), new NotEqualTo<T>()); 341 } 342 343 351 static public <T> Iterator <T> findMismatch(T[] ts, Collection <? extends T> pattern) { 352 return findMismatch(iterate(ts), pattern, new NotEqualTo<T>()); 353 } 354 355 364 static public <T> Iterator <T> findMismatch(T[] ts, T[] pattern, Comparator <? super T> comp) { 365 return findMismatch(iterate(ts), Arrays.asList(pattern), new NotEqualTo<T>(comp)); 366 } 367 368 377 static public <T> Iterator <T> 378 findMismatch(T[] ts, Collection <? extends T> pattern, Comparator <? super T> comp) { 379 return findMismatch(iterate(ts), pattern, new NotEqualTo<T>(comp)); 380 } 381 382 392 static public <T> Iterator <T> findMismatch(T[] ts, T[] pattern, BinaryFunctor<T,T,Boolean > neq) { 393 return findMismatch(iterate(ts), Arrays.asList(pattern), neq); 394 } 395 396 406 static public <T> Iterator <T> 407 findMismatch(T[] ts, Collection <? extends T> pattern, BinaryFunctor<T,T,Boolean > neq) { 408 return findMismatch(iterate(ts), pattern, neq); 409 } 410 411 415 421 static public <T> Iterator <T> find(Iterable <? extends T> iter, T value) { 422 return find(iter, equalTo(value)); 423 } 424 425 431 static public <T> Iterator <T> 432 find(Iterable <? extends T> iter, T value, Comparator <? super T> comp) { 433 return find(iter, equalTo(comp, value)); 434 } 435 436 437 443 static public <T> Iterator <T> find(Iterable <? extends T> iter, T value, Equality<T> eq) { 444 return find(iter, equalTo(eq, value)); 445 } 446 447 448 454 static public <T> Iterator <T> find(Iterable <? extends T> iter, UnaryFunctor<T,Boolean > fn) { 455 return find(iter.iterator(), fn); 456 } 457 458 459 465 static public <T> Iterator <T> findElement(Iterable <? extends T> iter, T[] values) { 466 return find(iter.iterator(), elementOf(values)); 467 } 468 469 470 477 static public <T> Iterator <T> 478 findElement(Iterable <? extends T> iter, Collection <? extends T> values) { 479 return find(iter.iterator(), elementOf(values) ); 480 } 481 482 489 static public <T> Iterator <T> 490 findElement(Iterable <? extends T> iter, T[] values, Comparator <? super T> comp) { 491 return find(iter.iterator(), elementOf(values, comp)); 492 } 493 494 495 502 static public <T> Iterator <T> 503 findElement(Iterable <? extends T> iter, Collection <? extends T> values, 504 Comparator <? super T> comp) { 505 return find(iter.iterator(), elementOf(values, comp)); 506 } 507 508 515 static public <T> Iterator <T> 516 findElement(Iterable <? extends T> iter, T[] values, BinaryFunctor<T,T,Boolean > bf) { 517 return find(iter.iterator(), elementOf(values, bf)); 518 } 519 520 521 528 static public <T> Iterator <T> 529 findElement(Iterable <? extends T> iter, Collection <? extends T> values, 530 BinaryFunctor<T,T,Boolean > bf) 531 { 532 return find(iter.iterator(), elementOf(values, bf)); 533 } 534 535 536 543 static public <T> Iterator <T> findAdjacent(Iterable <? extends T> iter) { 544 return findAdjacent(iter, new EqualTo<T>()); 545 } 546 547 548 555 static public <T> Iterator <T> 556 findAdjacent(Iterable <? extends T> iter, Comparator <? super T> comp) { 557 return findAdjacent(iter, new EqualTo<T>(comp)); 558 } 559 560 561 569 static public <T> Iterator <T> 570 findAdjacent(Iterable <? extends T> iter, BinaryFunctor<T,T,Boolean > eq) { 571 return findAdjacent(iter.iterator(), eq); 572 } 573 574 581 static public <T> Iterator <T> findRepeated (Iterable <? extends T> iter, int count, T value) { 582 return findRepeated(iter.iterator(), count, equalTo(value)); 583 } 584 585 593 static public <T> Iterator <T> 594 findRepeated (Iterable <? extends T> iter, int count, T value, Comparator <? super T> comp) { 595 return findRepeated(iter.iterator(), count, equalTo(comp, value)); 596 } 597 598 606 static public <T> Iterator <T> 607 findRepeated (Iterable <? extends T> iter, int count, T value, Equality<T> eq) { 608 return findRepeated(iter.iterator(), count, equalTo(eq, value)); 609 } 610 611 620 static public <T> Iterator <T> 621 findRepeated (Iterable <? extends T> iter, int count, UnaryFunctor<T,Boolean > eq) { 622 return findRepeated(iter.iterator(), count, eq); 623 } 624 625 626 632 static public <T> Iterator <T> 633 findSequence(Iterable <? extends T> iter, T[] pattern) { 634 return findSequence(iter.iterator(), Arrays.asList(pattern), new EqualTo<T>()); 635 } 636 637 638 644 static public <T> Iterator <T> 645 findSequence(Iterable <? extends T> iter, Collection <? extends T> pattern) { 646 return findSequence(iter.iterator(), pattern, new EqualTo<T>()); 647 } 648 649 650 656 static public <T> Iterator <T> 657 findSequence(Iterable <? extends T> iter, T[] pattern, Comparator <? super T> comp) { 658 return findSequence(iter.iterator(), Arrays.asList(pattern), new EqualTo<T>(comp)); 659 } 660 661 662 668 static public <T> Iterator <T> 669 findSequence(Iterable <? extends T> iter, Collection <? extends T> pattern, Comparator <T> comp) { 670 return findSequence(iter.iterator(), pattern, new EqualTo<T>(comp)); 671 } 672 673 674 680 static public <T> Iterator <T> 681 findSequence(Iterable <? extends T> iter, T[] pattern, BinaryFunctor<T,T,Boolean > fn) { 682 return findSequence(iter.iterator(), Arrays.asList(pattern), fn); 683 } 684 685 686 692 static public <T> Iterator <T> 693 findSequence(Iterable <? extends T> iter, Collection <? extends T> pattern, 694 BinaryFunctor<T,T,Boolean > fn) 695 { 696 return findSequence(iter.iterator(), pattern, fn); 697 } 698 699 700 708 static public <T> Iterator <T> findMismatch(Iterable <? extends T> iter, T[] pattern) { 709 return findMismatch(iter.iterator(), Arrays.asList(pattern), new NotEqualTo<T>()); 710 } 711 712 720 static public <T> Iterator <T> 721 findMismatch(Iterable <? extends T> iter, Collection <? extends T> pattern) { 722 return findMismatch(iter.iterator(), pattern, new NotEqualTo<T>()); 723 } 724 725 734 static public <T> Iterator <T> 735 findMismatch(Iterable <? extends T> iter, T[] pattern, Comparator <? super T> comp) { 736 return findMismatch(iter.iterator(), Arrays.asList(pattern), new NotEqualTo<T>(comp)); 737 } 738 739 748 static public <T> Iterator <T> 749 findMismatch(Iterable <? extends T> iter, Collection <? extends T> pattern, 750 Comparator <? super T> comp) { 751 return findMismatch(iter.iterator(), pattern, new NotEqualTo<T>(comp)); 752 } 753 754 764 static public <T> Iterator <T> 765 findMismatch(Iterable <? extends T> iter, T[] pattern, BinaryFunctor<T,T,Boolean > neq) { 766 return findMismatch(iter.iterator(), Arrays.asList(pattern), neq); 767 } 768 769 779 static public <T> Iterator <T> 780 findMismatch(Iterable <? extends T> iter, Collection <? extends T> pattern, 781 BinaryFunctor<T,T,Boolean > neq) { 782 return findMismatch(iter.iterator(), pattern, neq); 783 } 784 785 789 795 static public <T> Iterator <T> find(Iterator <? extends T> iterator, T value) { 796 return find(iterator, equalTo(value)); 797 } 798 799 805 static public <T> Iterator <T> 806 find(Iterator <? extends T> iterator, T value, Comparator <? super T> comp) { 807 return find(iterator, equalTo(comp, value)); 808 } 809 810 811 817 static public <T> Iterator <T> find(Iterator <? extends T> iterator, T value, Equality<T> eq) { 818 return find(iterator, equalTo(eq, value)); 819 } 820 821 822 828 static public <T> Iterator <T> find(Iterator <? extends T> iterator, UnaryFunctor<T,Boolean > eq) { 829 FindIterator<T> finder = finder(iterator); 830 finder.findNext(eq); 831 return finder; 832 } 833 834 835 841 static public <T> Iterator <T> findElement(Iterator <? extends T> iterator, T[] values) { 842 return find(iterator, elementOf(values)); 843 } 844 845 846 853 static public <T> Iterator <T> 854 findElement(Iterator <? extends T> iterator, Collection <? extends T> values) { 855 return find(iterator, elementOf(values)); 856 } 857 858 865 static public <T> Iterator <T> 866 findElement(Iterator <? extends T> iterator, T[] values, Comparator <? super T> comp) { 867 return find(iterator, elementOf(values, comp)); 868 } 869 870 871 878 static public <T> Iterator <T> 879 findElement(Iterator <? extends T> iterator, Collection <? extends T> values, 880 Comparator <? super T> comp) { 881 return find(iterator, elementOf(values, comp)); 882 } 883 884 891 static public <T> Iterator <T> 892 findElement(Iterator <? extends T> iterator, T[] values, BinaryFunctor<T,T,Boolean > bf) { 893 return find(iterator, elementOf(values, bf)); 894 } 895 896 897 904 static public <T> Iterator <T> 905 findElement(Iterator <? extends T> iterator, Collection <? extends T> values, 906 BinaryFunctor<T,T,Boolean > bf) { 907 return find(iterator, elementOf(values, bf)); 908 } 909 910 917 static public <T> Iterator <T> findAdjacent(Iterator <? extends T> iterator) { 918 return findAdjacent(iterator, new EqualTo<T>()); 919 } 920 921 922 929 static public <T> Iterator <T> 930 findAdjacent(Iterator <? extends T> iterator, Comparator <? super T> comp) { 931 return findAdjacent(iterator, new EqualTo<T>(comp)); 932 } 933 934 935 943 static public <T> Iterator <T> 944 findAdjacent(Iterator <? extends T> iterator, BinaryFunctor<T,T,Boolean > eq) { 945 if (!iterator.hasNext()) { 947 return lookAhead(iterator, 1); 948 } 949 950 LookAheadIterator<T> lai = lookAhead(iterator, 2); 951 while (lai.hasNextPlus(2)) { 952 T arg1 = lai.peek(1); 953 T arg2 = lai.peek(2); 954 if (eq.fn(arg1, arg2)) { 955 return lai; 956 } 957 958 lai.next(); 959 } 960 961 lai.next(); 964 return lai; 965 } 966 967 968 975 static public <T> Iterator <T> 976 findRepeated (Iterator <? extends T> iterator, int count, T value) { 977 return findRepeated(iterator, count, equalTo(value)); 978 } 979 980 988 static public <T> Iterator <T> 989 findRepeated (Iterator <? extends T> iterator, int count, T value, Comparator <? super T> comp) { 990 return findRepeated(iterator, count, equalTo(comp, value)); 991 } 992 993 1001 static public <T> Iterator <T> 1002 findRepeated (Iterator <? extends T> iterator, int count, T value, Equality<T> eq) { 1003 return findRepeated(iterator, count, equalTo(eq, value)); 1004 } 1005 1006 1015 static public <T> Iterator <T> 1016 findRepeated (Iterator <? extends T> iterator, int count, UnaryFunctor<T,Boolean > eq) { 1017 if (!iterator.hasNext() || count == 0) { 1018 return new LookAheadIterator<T>(iterator, 1); 1019 } 1020 1021 LookAheadIterator<T> lai = lookAhead(iterator, count); 1022 1023 OUTER: 1024 while (lai.hasNextPlus(count)) { 1025 1026 for (int i = 1; i <= count; ++i) { 1028 T arg = lai.peek(i); 1029 1030 if ( ! eq.fn(arg)) { 1034 for (int j = i; j > 0; --j) { 1035 lai.next(); 1036 } 1037 1038 continue OUTER; 1039 } 1040 } 1041 1042 return lai; 1045 } 1046 1047 return new LookAheadIterator<T>(new EmptyIterator<T>(), 1); 1049 } 1050 1051 1057 static public <T> Iterator <T> findSequence(Iterator <? extends T> iterator, T[] pattern) { 1058 return findSequence(iterator, Arrays.asList(pattern), new EqualTo<T>()); 1059 } 1060 1061 1062 1068 static public <T> Iterator <T> 1069 findSequence(Iterator <? extends T> iterator, Collection <? extends T> pattern) { 1070 return findSequence(iterator, pattern, new EqualTo<T>()); 1071 } 1072 1073 1074 1080 static public <T> Iterator <T> 1081 findSequence(Iterator <? extends T> iterator, T[] pattern, Comparator <? super T> comp) { 1082 return findSequence(iterator, Arrays.asList(pattern), new EqualTo<T>(comp)); 1083 } 1084 1085 1086 1092 static public <T> Iterator <T> 1093 findSequence(Iterator <? extends T> iterator, Collection <? extends T> pattern, 1094 Comparator <T> comp) { 1095 return findSequence(iterator, pattern, new EqualTo<T>(comp)); 1096 } 1097 1098 1099 1105 static public <T> Iterator <T> 1106 findSequence(Iterator <? extends T> iterator, T[] pattern, BinaryFunctor<T,T,Boolean > fn) { 1107 return findSequence(iterator, Arrays.asList(pattern), fn); 1108 } 1109 1110 1111 1117 static public <T> Iterator <T> 1118 findSequence(Iterator <? extends T> iterator, Collection <? extends T> pattern, 1119 BinaryFunctor<T,T,Boolean > fn) { 1120 int length = pattern.size(); 1122 if (!iterator.hasNext() || length == 0) { 1123 return lookAhead(iterator, 1); 1124 } 1125 1126 LookAheadIterator<T> lai = lookAhead(iterator, length); 1127 1128 1131 OUTER: 1132 while (lai.hasNextPlus(length)) { 1133 int idx = 1; 1134 1135 for (T obj : pattern) { 1137 1138 if (!fn.fn(obj, lai.peek(idx))) { 1141 lai.next(); 1142 continue OUTER; 1143 } 1144 1145 ++idx; 1146 } 1147 1148 return lai; 1151 } 1152 1153 return new LookAheadIterator<T>(new EmptyIterator<T>(), 1); 1155 } 1156 1157 1158 1166 static public <T> Iterator <T> findMismatch(Iterator <? extends T> iterator, T[] pattern) { 1167 return findMismatch(iterator, Arrays.asList(pattern), new NotEqualTo<T>()); 1168 } 1169 1170 1178 static public <T> Iterator <T> 1179 findMismatch(Iterator <? extends T> iterator, Collection <? extends T> pattern) { 1180 return findMismatch(iterator, pattern, new NotEqualTo<T>()); 1181 } 1182 1183 1192 static public <T> Iterator <T> 1193 findMismatch(Iterator <? extends T> iterator, T[] pattern, Comparator <? super T> comp) { 1194 return findMismatch(iterator, Arrays.asList(pattern), new NotEqualTo<T>(comp)); 1195 } 1196 1197 1206 static public <T> Iterator <T> 1207 findMismatch(Iterator <? extends T> iterator, Collection <? extends T> pattern, 1208 Comparator <? super T> comp) { 1209 return findMismatch(iterator, pattern, new NotEqualTo<T>(comp)); 1210 } 1211 1212 1222 static public <T> Iterator <T> 1223 findMismatch(Iterator <? extends T> iterator, T[] pattern, BinaryFunctor<T,T,Boolean > neq) { 1224 return findMismatch(iterator, Arrays.asList(pattern), neq); 1225 } 1226 1227 1237 static public <T> Iterator <T> 1238 findMismatch(Iterator <? extends T> iterator, Collection <? extends T> pattern, 1239 BinaryFunctor<T,T,Boolean > neq) { 1240 LookAheadIterator<? extends T> patternIter = new LookAheadIterator<T>(pattern.iterator()); 1241 LookAheadIterator<T> lai = lookAhead(iterator, 1); 1242 while (lai.hasNextPlus(1) && patternIter.hasNextPlus(1)) { 1243 T arg1 = lai.peek(1); 1244 T arg2 = patternIter.peek(1); 1245 if (neq.fn(arg1,arg2)) { 1246 return lai; 1247 } 1248 1249 lai.next(); 1250 patternIter.next(); 1251 } 1252 1253 return lai; 1254 } 1255 1256 1260 static public <T> UnaryFunctor<T,Boolean > elementOf(T[] values) { 1261 return new ElementOf<T>().bind2nd(Arrays.asList(values)); 1262 } 1263 1264 static public <T> UnaryFunctor<T,Boolean > elementOf(Collection <? extends T> values) { 1265 return new ElementOf<T>().bind2nd(values); 1266 } 1267 1268 static public <T> UnaryFunctor<T,Boolean > elementOf(T[] values, Comparator <? super T> comp) { 1269 return new ElementOf<T>(new EqualTo<T>(comp)).bind2nd(Arrays.asList(values)); 1270 } 1271 1272 static public <T> UnaryFunctor<T,Boolean > 1273 elementOf(Collection <? extends T> values, Comparator <? super T> comp) { 1274 return new ElementOf<T>(new EqualTo<T>(comp)).bind2nd(values); 1275 } 1276 1277 static public <T> UnaryFunctor<T,Boolean > elementOf(T[] values, BinaryFunctor<T,T,Boolean > bf) { 1278 return new ElementOf<T>(bf).bind2nd(Arrays.asList(values)); 1279 } 1280 1281 static public <T> UnaryFunctor<T,Boolean > 1282 elementOf(Collection <? extends T> values, BinaryFunctor<T,T,Boolean > bf) { 1283 return new ElementOf<T>(bf).bind2nd(values); 1284 } 1285 1286 static private <T> FindIterator<T> finder(Iterator <? extends T> iterator) { 1287 if (iterator instanceof FindIterator) 1288 return (FindIterator<T>) iterator; 1289 1290 return new FindIterator(iterator); 1291 } 1292 1293 static private <T> LookAheadIterator<T> lookAhead(Iterator <? extends T> iterator, int size) { 1294 if (iterator instanceof LookAheadIterator) { 1295 LookAheadIterator<T> lai = (LookAheadIterator<T>) iterator; 1296 if (lai.getMaxPeekSize() >= size) 1297 return lai; 1298 } 1299 1300 return new LookAheadIterator(iterator, size); 1301 } 1302} 1303 | Popular Tags |