Зачем нужно сдвигать элементы ArrayList влево после удаления элемента?

Насколько мне известно, вот шаги по удалению элемента в ArrayList.

  1. Не нужно ничего делать с целевым элементом
  2. Итерировать по массиву от 1 после удаленного элемента до последнего элемента
  3. Скопируйте каждый элемент на место 1 перед ним.
  4. Установите последний элемент на null

Почему бы просто не установить элемент, который мы хотим удалить, на null? Это всего лишь один шаг.

Может ли кто-нибудь объяснить достоинства приведенной выше схемы? Заранее спасибо.

Думайте о списке как о книге, на всех страницах которой написано. Удаление элемента похоже на удаление страницы из книги. То, что вы предлагаете, больше похоже на стирание того, что находится на странице - это совсем не та же операция. (Если ваш конкретный вариант использования подходит для того, чтобы размер списка оставался прежним и т. д., Просто позвоните list.set(index, null) - но в большинстве случаев это не то, что требуется.)

Jon Skeet 27.07.2018 13:22

В этом разница между удалением и заменой. В последнем случае вы замените элемент нулевым объектом.

Juan 27.07.2018 13:24

@DaisyShipton, что было бы неплохо в качестве ответа ;-)

Ousmane D. 27.07.2018 13:24

Итак, если null в списке означает, что элемент с этим индексом «удален», то что, если я хочу, чтобы фактически сохранил null как элемент? как отличить удаленный элемент от элемента действительныйnull ?.

Ousmane D. 27.07.2018 13:28

вы знаете, что ArrayList имеет несколько методов remove - ты не должен выполнять все эти шаги! (они вроде как требуются для массивов) - и null - допустимый элемент для вставки в ArrayList, зачем программисту он нужен?

user85421 27.07.2018 13:33
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
2
5
932
4
Перейти к ответу Данный вопрос помечен как решенный

Ответы 4

Потому что это не одно и то же (давайте удалим "c"):

  • ["a", "b", "d", "e"]
  • ["a", "b", null, "d", "e"]

Между удалением и заменой большая разница:

  • Удаление изменяет индексы, удаляет элемент и сдвигает (влияет) на остальные. Это также изменяет размер списка. Бывший. элемент "d" доступен по индексу 2 (перенесен из 3).
  • Замена заменяет элемент и сохраняет индексы элементов, а размер списка также остается неизменным. Бывший. элемент "d" доступен по индексу 4 (без изменений).
«Есть большая разница между удалением и заменой». в точку. +1.
Ousmane D. 27.07.2018 13:26

возможно также «разрешить элементы null в списке» или «как отличить желаемый null от удаленного заполнителя null (или около того)»

user85421 27.07.2018 13:40
null всегда разрешен в списке (по определению List). Невозможно отличить желаемый null от нежелательного. Если вы хотите сохранить индексы, вы можете заменить «c» на «поддельный объект» en.wikipedia.org/wiki/Null_object_pattern.
Nikolas Charalambidis 27.07.2018 13:43

... потому что так работают списки. Многие варианты использования нуждаются в таком динамическом изменении размера, поэтому Java имеет интерфейс для концепции списка. ArrayList - одна из нескольких реализаций List, LinkedList - другая.

У нас уже было поведение, которое вы описываете, массив, поэтому там, где вам нужно это поведение, вы можете использовать, скажем, String[].

Ответ принят как подходящий

Why don't just set the element we want to remove to null?

«установка» элемента в нуль - это не удаление элемент, это замена элемент.

Есть еще одна проблема с этим подходом: если null в списке означает, что элемент по этому индексу «удален», то что, если я действительно хочу сохранить null как элемент? как отличить удаленный элемент от действительного элемента null?

Используйте методы remove в API List<T>, не пытайтесь изобретать велосипед, они настолько хороши, насколько это возможно.

'дежавю' ! [:-) правильный ответ ИМХО на "Может ли кто-нибудь объяснить достоинства приведенной выше схемы?"

user85421 27.07.2018 13:41

@CarlosHeuberger Вау с французскими персонажами тоже :). просто хотел указать на другую проблему, которая может возникнуть при установке для элементов значения null.

Ousmane D. 27.07.2018 13:43

Я просто принято к сведению, что я только что прокомментировал этот вопрос (и Николас ответил)

user85421 27.07.2018 13:44

Благодаря вашему ответу я понял, что меня запутали между «заменой (на нуль)» и «удалением». Кажется, что схема, описанная в моем вопросе, обычно называется «удалить». Теперь понял это. Большое спасибо.

Bonsaisteak 30.07.2018 03:21

ArrayLists похожи на массивы с одним отличием - их размер можно изменять (в данном примере это не имеет значения). Рассмотрим следующий массив: [ref1,ref2,ref3,ref4], где ref1: 4 - ссылки на некоторые объекты. Это означает, что они не содержат самого объекта, они только указывают на объект. Теперь, если вы хотите удалить ref2, например, объявив его нулевым, это означает, что теперь он не будет указывать на какой-либо объект (ref2 = null), но это не означает, что сама ссылка исчезнет. Ваш новый массив (ArrayList) теперь будет [ref1,null,ref3,ref4] . Понимаете? Есть разница между заменой и удалением ....

Другие вопросы по теме