Дополнительно
Удаление элемента из массива (Java)
Есть ли какой-нибудь быстрый (и красивый на вид) способ удалить элемент из массива в Java?
140
15
Вы можете использовать Коммонс-Ланг'ы ArrayUtils.
commons.apache.org library:Javadocs
Ваш вопрос Это'т очень понятно. Из своего собственного ответа, я могу сказать лучше того, что вы пытаетесь сделать:
NB: это не проверялось. Проверка на ошибки оставлено в качестве упражнения для читателя (Я'd не бросит IllegalArgumentException если какой-либо входной или deleteMe нуль; пустой список, пустой список на вход не'т смысл. Удаление нулевых строк из массива может иметь смысл, но я'МР оставлю это в качестве упражнения слишком; в настоящее время он будет бросить NPE при попытке позвонить на равных deleteMe если deleteMe имеет значение null.)
Выбор я сделал здесь:
Я использовал LinkedList не. Итерации должны быть так же быстро, и вы избежите любых размеров, или выделение слишком большой список, если вы в конечном итоге удаление много элементов. Вы могли бы использовать ArrayList, и установить первоначальный размер на длину ввода. Это скорее не'т сделать много различий.
Лучшим выбором будет использовать коллекцию, но если это по какой-то причине использовать
arraycopy
. Вы можете использовать его для копирования и в то же время немного отличается от офсетной.Например:
Редактировать в ответ на комментарий:
Это's Не еще один хороший способ, это's действительно единственный приемлемый способ-любые инструменты, которые позволяют эту функцию (например, Java.ArrayList или Апач утилит) будет использовать этот метод под одеялом. Также, вы действительно должны использовать ArrayList С (или связанный список, если вы удалите из середины много) так что это стоило'т быть проблемой, если вы делаете это в качестве домашнего задания.
Выделить коллекцию (создает новый массив), затем удалить элемент (который сбор будет сделать с помощью arraycopy) тогда позвоните toArray в него (создает новый массив) для каждого удалить подводит нас к точке, где это's не в оптимизации проблема, это'ы преступно плохого программирования.
Предположим, что у вас массив, занимая, скажем, 100 МБ оперативной памяти. Теперь вам нужно перебрать и удалить 20 элементов.
Дайте ему попробовать...
Я знаю, ты думаешь, что это's не собирается быть таким, или что если вы начали удалять, что много за один раз вы'd в код это по-разному, но я've фиксированная ужасно много кода, где кто-то делал предположения, как и что.
Вы не можете удалить элемент из основного массива Java. Вместо этого рассмотрите различные Collections и ArrayList.
Хорошим решением было бы использовать список вместо массива.
Если вы должны использовать массивы, то два вызова
System.arraycopy
, скорее всего, будут самыми быстрыми.(
Arrays.asList
также является хорошим кандидатом для работы с массивами, но он, похоже, не поддерживаетremove
).Я думаю, что вопрос был с просьбой решения без использования API коллекций. Кто-то использует массивы либо на низкоуровневых деталях, где вопросы производительности, или для слабосвязанной интеграции СОА. В дальнейшем, это ОК, чтобы преобразовать их в коллекции и передать их бизнес-логике, как и что.
Низкий уровень производительности вещи, это, как правило, уже затуманено быстрый-и-грязный императив государства-смешиваясь ПО для петель и т. д. В этом случае преобразования взад и вперед между коллекциями и массивами громоздко, нечитабельно, и даже ресурсов.
Кстати, Топкодере, кто? Всегда такими параметрами! Так что будьте готовы к тому, чтобы справиться с ними, когда на арене.
Ниже-мое видение проблемы и решения. Она отличается по функциональности от обоих, какой дал Билл К и jelovirt. Кроме того, он обрабатывает корректно в случае, когда элемент отсутствует в массиве.
Надеюсь, что помогает!
Вы можете использовать ArrayUtils по API, чтобы удалить его в "и приятный глазу как-то". Он реализует многие операции (удалить, найти, добавить, и т. д.) На массивах. Взгляните. Это сделало мою жизнь проще.
Вы не можете изменить длину массива, но вы можете изменить значения Индекса проводятся путем копирования нового значения и хранить их в существующий индекс. 1=Майк , 2=Джеффа // 10 = 11 Джордж идет на 1 перезапись Майк .
Более некоторые предварительные условия, необходимые для тех, написанных Биллом K и dadinn
ладно, THX много сейчас я использую СТГ такой:
Замените элемент, который будет удален с последнего элемента, если размер массива не заинтересованы.
Копия ваш исходный массив в другой массив, без элемент, который будет удален.
Более простой способ сделать это-использовать список, набор... и использовать метод remove ().
Я надеюсь, что вы используете коллекции Java, С / с коллекциями в Java общин!
С Ява.утиль.Класса ArrayList вы можете делать вещи, как следующие:
Используйте
коллекции
:Конечно, создайте другой массив :)