Прежде всего, я извиняюсь за длинный ответ. Если я ошибаюсь в любой момент, вы всегда можете исправить меня. Здесь я сравниваю некоторые варианты решения решения
ВАРИАНТ 1 < ArrayList>:
В своем коде вы использовали ArrayList.removeAll
метод позволяет смотреть в коду RemoveAll
исходный код RemoveAll
public boolean removeAll(Collection<?> c) {
return batchRemove(c, false);
}
поэтому необходимо знать, что в batchRemove
методе. Здесь link. Ключевая часть здесь, если вы можете увидеть
for (; r < size; r++)
if (c.contains(elementData[r]) == complement)
elementData[w++] = elementData[r];
теперь позволяет заглянуть в contains
метод, который является просто оболочкой из indexOf
метода. link. В методе indexOf выполняется операция O (n).(Отметив лишь часть здесь)
for (int i = 0; i < size; i++)
if (elementData[i]==null)
return i;
Так над всем это
O (N^2)
операции в removeAll
ВАРИАНТ 2 < HashSet>: ранее я написал что-то здесь, но, похоже, я ошибался в некоторых случаях так что удаляем это. Лучше возьмите предложение от эксперта по Hashset. Я не уверен в вашем случае, будет ли hashmap лучшим решением. Поэтому я предлагаю другое решение
ВАРИАНТ 3 < Мое предложение Вы можете попробовать>:
шаг 1: если данные отсортированы, то нет необходимости этого шага еще не сортирует список, который вы будете вычитать (второй список)
шаг 2: для каждого элемента списка несортированным запустить бинарный поиск во втором списке
шаг 3 :, если не найдено, то хранить в новом списке результатов, но если матч обнаружено затем DonT добавить
этап 4: список результатов является вашим окончательным ответом
затраты варианты 3:
шаг 1:, если не отсортирован O(nlogn)
время
шаг 2:O(nlogn)
время
шаг 3:O(n)
пространство
**
поэтому в целом O (NlogN) времени и О (п) пространство
**