Вот некоторый код, который использует регулярное выражение для сокращения внутреннего цикла, если нет тестовых строк найдено в целевой строке.
public static void main(String[] args) throws Exception {
List<String> haystack = Arrays.asList(new String[] { "ABCD", "EFGH", "IJ KL", "M NOP", "UVW X" });
List<String> needles = Arrays.asList(new String[] { "IJ", "NOP" });
// To cut down on iterations, create one big regex to check the whole haystack
StringBuilder sb = new StringBuilder();
sb.append(".*(");
for (String needle : needles) {
sb.append(needle).append('|');
}
sb.replace(sb.length() - 1, sb.length(), ").*");
String regex = sb.toString();
for (String target : haystack) {
if (!target.matches(regex)) {
System.out.println("Skipping " + target);
continue;
}
for (String needle : needles) {
if (target.contains(needle)) {
System.out.println(target + " contains " + needle);
}
}
}
}
Выход:
Skipping ABCD
Skipping EFGH
IJ KL contains IJ
M NOP contains NOP
Skipping UVW X
Если вы действительно хотите стать милым, вы можете использовать бинарный поиск, чтобы определить, какие сегменты целевого списка совпадают, но это может не стоить этого.
Это зависит от того, насколько вероятно, что вы найдете хит. Низкие показатели попадания дадут хороший результат. Высокие показатели попадания будут работать не намного лучше, чем версия с простым вложенным циклом. рассмотрите возможность переворачивания петель, если одни иглы поражают множество целей, а другие - ни одной.
Это все об отмене пути поиска как можно скорее.