Вопрос-ответ

Removing an element from an Array (Java) [duplicate]

Удаление элемента из массива (Java) [дубликат]

Есть ли какой-нибудь быстрый (и красивый) способ удалить элемент из массива в Java?

Переведено автоматически
Ответ 1

Вы могли бы использовать ArrayUtils от commons lang'а.

array = ArrayUtils.removeElement(array, element)

commons.apache.библиотека организации: Javadocs

Ответ 2

Ваш вопрос не очень понятен. Из вашего собственного ответа я могу лучше сказать, что вы пытаетесь сделать:

public static String[] removeElements(String[] input, String deleteMe) {
List result = new LinkedList();

for(String item : input)
if(!deleteMe.equals(item))
result.add(item);

return result.toArray(input);
}

ПРИМЕЧАНИЕ: Это непроверено. Проверка ошибок оставлена в качестве упражнения для читателя (я бы выбросил, IllegalArgumentException если либоinput, либо deleteMe равно null; пустой список при вводе null list не имеет смысла. Удаление нулевых строк из массива может иметь смысл, но я оставлю это как упражнение; в настоящее время он будет выдавать NPE при попытке вызвать equals on, deleteMe если deleteMe равно null .)

Варианты, которые я сделал здесь:

Я использовал LinkedList. Итерация должна быть такой же быстрой, и вы избегаете каких-либо изменений размера или выделения слишком большого списка, если в итоге вы удаляете много элементов. Вы могли бы использовать ArrayList и установить начальный размер равным длине входных данных. Скорее всего, это не имело бы большого значения.

Ответ 3

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

Например:

public void removeElement(Object[] arr, int removedIdx) {
System.arraycopy(arr, removedIdx + 1, arr, removedIdx, arr.length - 1 - removedIdx);
}

Редактировать в ответ на комментарий:

Это не другой хороший способ, это действительно единственный приемлемый способ - любые инструменты, которые позволяют использовать эту функциональность (например, Java.ArrayList или apache utils), будут использовать этот метод тайно. Кроме того, вам ДЕЙСТВИТЕЛЬНО следует использовать ArrayList (или связанный список, если вы часто удаляете из середины), так что это даже не должно быть проблемой, если вы не выполняете это в качестве домашнего задания.

Выделение коллекции (создает новый массив), затем удаление элемента (что коллекция сделает с помощью arraycopy), затем вызов toArray для него (создает ВТОРОЙ новый массив) для каждого удаления приводит нас к тому, что это не проблема оптимизации, это преступно плохое программирование.

Предположим, у вас есть массив, занимающий, скажем, 100 МБ оперативной памяти. Теперь вы хотите выполнить итерацию по нему и удалить 20 элементов.

Попробуйте...

Я знаю, вы ПРЕДПОЛАГАЕТЕ, что он не будет таким большим, или что если бы вы удаляли так много элементов одновременно, вы бы закодировали его по-другому, но я исправил ужасно много кода, где кто-то делал подобные предположения.

Ответ 4

Вы не можете удалить элемент из базового массива Java. Вместо этого взгляните на различные коллекции и ArrayList .

java arrays