Если в наборе productIds
, где a.startsWith(b)
нет двух значений a
и b
, то вы можете значительно улучшить производительность, сделав набор TreeSet
.
TreeSet<String> productIds = (some code to collect the strings from another API) ...;
* 1008. *
Или:
.filter(product -> Optional.ofNullable(productIds.floor(product.getKey()))
.map(product.getKey()::startsWith).orElse(false))
Это меняет производительность с O (n * m) до O (n * log (m)) , где m
- это размер productIds
.
ОБНОВЛЕНИЕ
Если есть , имеются значения a
и b
in productIds
установить где a.startsWith(b)
, тогда вам понадобится немного дополнительных логик c.
Например, если набор содержит G
и GED
, и вы проверяете, содержит ли он префикс для GET
, затем floor()
вернет GED
, поэтому вам нужно удалить последний символ и повторить поиск с GE
, теперь возвращая G
, чтобы найти его в качестве действительного префикса.
Поэтому нам нужно добавить al oop для перепроверки:
.filter(product -> {
String candidate = product.getKey();
while ((candidate = productIds.floor(candidate)) != null) {
if (product.getKey().startsWith(candidate))
return true;
candidate = candidate.substring(0, candidate.length() - 1);
}
return false;
})
Это немного замедлит поиск, но все же будет намного лучше, чем полный последовательный поиск.