Подтвердить что ты не робот

Удалить первые 'n' элементы из списка без итерации

Мне нужен эффективный способ удаления элементов из списка. Если какое-то условие происходит, мне нужно удалить первые "n" элементы из списка. Может ли кто-нибудь предложить лучший способ сделать это? Пожалуйста, имейте в виду: производительность для меня является фактором, поэтому мне нужен более быстрый способ, чем повторение. Спасибо.

Я думаю о способе, посредством которого "n-й элемент" можно сделать стартом списка, чтобы 0-n элементов получал сбор мусора. Возможно ли это?

4b9b3361

Ответ 1

Если производительность для вас важна, я не уверен, что использование встроенных функций из ArrayList - это путь. Я сомневаюсь, что они работают быстрее, чем O (n), и, к сожалению, Java-документация ничего не говорит об этом. Возможно, вам стоит изучить некоторые созданные на заказ структуры, такие как Rope.

Ответ 2

создать subList()

Возвращает представление части этого списка между исключительными исключениями из Index, inclusive и toIndex. (Если fromIndex и toIndex равны, возвращаемый список пуст.) Возвращенный список поддерживается этим списком, поэтому изменения в возвращенном списке отражаются в этом списке и наоборот. Возвращенный список поддерживает все дополнительные операции с списком, поддерживаемые этим списком.

Проверьте реализацию этого метода и выполните некоторые тесты для определения производительности

Ответ 3

Вы можете использовать ArrayList.removeRange(int fromIndex, int toIndex).

Цитирование документации:

Удаляет из этого списка все элементы, индекс которых находится между fromIndex, inclusive и toIndex, эксклюзивный. Сдвигает любые последующие элементы слева (уменьшает их индекс). Этот вызов сокращает список элементов (toIndex - fromIndex). (Если toIndex == fromIndex, это операция не имеет эффекта.)

Ответ 4

Ответ Jigar Joshi уже содержит нужное вам решение. Я хотел добавить еще кое-что. Думаю, вызов clear() в подсписке будет обрабатывать вашу работу. Но он может использовать Итерация в фоновом режиме, я не уверен. Пример script для вашего использования:

ArrayList<Integer> list = new ArrayList<Integer>();
ArrayList<Integer> subList = (ArrayList<Integer>) list.subList(0, 9);
subList.clear();

Ответ 5

Если вы часто изменяете список, почему бы не использовать класс LinkedList?

Если вы используете класс ArrayList, при удалении элемента массив всегда должен двигаться.

Ответ 6

рассмотрите возможность использования Пропустить списки, что даст вам хорошую производительность, если вы сделаете количество аликвоты отбрасываемых предметов до интервала

невозможно пропустить итерации вообще, но можно уменьшить количество итераций или даже сделать его "постоянным"