Не думаю, что вы получите это намного быстрее, но ваш код будет выглядеть проще и не станет медленнее a.removeAll(b);
. removeAll () является частью Java-API.
Для анализа эффективности: Ваш пример кода O (n ^ 2), который масштабируется не очень хорошо, но также не является самой ужасной вещью на земле (экспоненциальная сложность - вещь, которую вы не хотите). Пока вы не знаете внутреннюю организацию данных в Коллекции, вы не получите более высокую производительность. removeAll () реализуется самим классом и знает о внутренней организации. Таким образом, если данные организованы в Hash, вы можете получить лучшие результаты, если данные организованы в несортированный массив, сложность будет той же. Набор должен эффективно искать, если новый элемент уже находится в наборе, поэтому я подозреваю, что какой-то Hash является внутренним представлением, особенно если реализация называется HashSet. : -)
РЕДАКТИРОВАТЬ: ОП изменил вопрос, чтобы упомянуть, что это не только для Java. removeAll () - это Java-API, так что это (или что-то подобное) может быть недоступно на других языках. Как было сказано ранее, если коллекции являются несортированными массивами без каких-либо других ограничений, два цикла for уже являются самым быстрым решением. Но если данные организованы иначе, у вас есть более быстрые варианты. Если две коллекции являются отсортированными данными (в моем примере сначала идет наименьший элемент), вы можете сделать следующее (уменьшив сложность до O (n)):
int bIndex = 0;
for(int i = 0 ; i < a.size(); i++) {
while (a[i] < b[bIndex]) {bIndex++;}
if (a[i] == b[bIndex]) {markForRemoval(a[i]);} // I mark this only for removal, as the actual removal would make your index incorrect
}
Если данные организованы в виде хэша в обеих коллекциях, вам также нужен только один цикл for, который напрямую обращается к элементу в b. Возможны другие возможные организации данных.