Удаление элемента из массива (Java) [дубликат]
этот вопрос уже есть ответ здесь:
- Как удалить объекты из массива в Java? 18 ответов
есть ли быстрый (и красивый) способ удалить элемент из массива в Java?
15 ответов:
Ваш вопрос не очень ясен. Из вашего собственного ответа я могу лучше сказать, что вы пытаетесь сделать:
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); }
NB: это не проверялось. Проверка ошибок остается в качестве упражнения для читателя (я бы бросил IllegalArgumentException, если либо input, либо deleteMe равно null; пустой список на входе null list не имеет смысла. Удаление нулевых строк из массива может иметь смысл, но я оставлю это как упражнение; в настоящее время он будет бросать NPE, когда он пытается вызвать equals on deleteMe если deleteMe равно null.)
выбор, который я сделал здесь:
я использовал LinkedList. Итерация должна быть такой же быстрой, и вы избегаете любых изменений размера или выделения слишком большого списка, если вы в конечном итоге удаляете много элементов. Вы можете использовать ArrayList и установить начальный размер на длину ввода. Скорее всего, это не будет иметь большого значения.
лучшим выбором было бы использовать коллекцию, но если это по какой-то причине, используйте
arraycopy
. Вы можете использовать его для копирования из и в тот же массив с немного другим смещением.например:
public void removeElement(Object[] arr, int removedIdx) { System.arraycopy(arr, removedIdx + 1, arr, removedIdx, arr.length - 1 - removedIdx); }
редактировать в ответ на комментарий:
это не другой хороший способ, это действительно единственный приемлемый способ.
чтобы выделить коллекцию (создает новый массив), затем удалите элемент (что будет делать коллекция используя arraycopy) затем вызовите toArray на нем (создает второй новый массив) для каждого удаления приводит нас к тому, что это не проблема оптимизации, это преступно плохое Программирование.
предположим, что у вас есть массив, занимающий, скажем, 100 МБ оперативной памяти. Теперь вы хотите перебрать его и удалить 20 элементов.
дайте ему попробовать...
Я знаю, вы предполагаете, что он не будет таким большим, или что если бы вы удалили столько сразу, вы бы закодировали его по-другому, но я исправлено очень много кода, где кто-то сделал такие предположения.
вы не можете удалить элемент из базового массива Java. Вместо этого взгляните на различные коллекции и ArrayList.
хорошим решением было бы использовать список вместо массива в первую очередь.
List.remove(index)
если вы есть использовать массивы, два вызова
System.arraycopy
скорее всего будет самый быстрый.Foo[] result = new Foo[source.length - 1]; System.arraycopy(source, 0, result, 0, index); if (source.length != index) { System.arraycopy(source, index + 1, result, index, source.length - index - 1); }
(
Arrays.asList
также является хорошим кандидатом для работы с массивами, но это, кажется, не поддерживаетremove
.)
Я думаю, что вопрос просил решения без использование API коллекций. Один использует массивы либо для низкоуровневых деталей, где важна производительность, либо для слабо связанной интеграции SOA. В дальнейшем можно преобразовать их в коллекции и передать их в бизнес-логику как таковую.
для низкоуровневого материала представления, он обычно уже запутан быстр-и-грязным императивным положением-смешивать мимо для петель, ЕТК. В таком случае преобразование туда и обратно между коллекциями и массивами является громоздким, нечитаемым и даже ресурсоемким.
кстати, Топкодер, кто-нибудь? Всегда эти параметры массива! Так что будьте готовы, чтобы иметь возможность справиться с ними, когда на арене.
Ниже приводится моя интерпретация проблемы и ее решение. Он отличается по функциональности от обоих из одного заданного Билл К и jelovirt. Кроме того, он изящно обрабатывает случай, когда элемент не находится в массиве.
надеюсь, что это поможет!
public char[] remove(char[] symbols, char c) { for (int i = 0; i < symbols.length; i++) { if (symbols[i] == c) { char[] copy = new char[symbols.length-1]; System.arraycopy(symbols, 0, copy, 0, i); System.arraycopy(symbols, i+1, copy, i, symbols.length-i-1); return copy; } } return symbols; }
вы могли бы использовать ArrayUtils API чтобы удалить его в "красивый способ". Он реализует многие операции (удалить, найти, добавить, и т. д.) На массивах.
Взглянуть. Это сделало мою жизнь проще.
еще несколько предварительных условий необходимы для тех, которые написаны Биллом К и дадинном
Object[] newArray = new Object[src.length - 1]; if (i > 0){ System.arraycopy(src, 0, newArray, 0, i); } if (newArray.length > i){ System.arraycopy(src, i + 1, newArray, i, newArray.length - i); } return newArray;
вы не можете изменить длину массива, но вы можете изменить значения, которые содержит индекс, скопировав новые значения и сохранив их в существующий номер индекса. 1=Майк, 2=Джефф // 10 = Джордж 11 переходит к 1 перезаписи Майка .
Object[] array = new Object[10]; int count = -1; public void myFunction(String string) { count++; if(count == array.length) { count = 0; // overwrite first } array[count] = string; }
ладно, спасибо большое теперь я использую sth вот так:
public static String[] removeElements(String[] input, String deleteMe) { if (input != null) { List<String> list = new ArrayList<String>(Arrays.asList(input)); for (int i = 0; i < list.size(); i++) { if (list.get(i).equals(deleteMe)) { list.remove(i); } } return list.toArray(new String[0]); } else { return new String[0]; } }
скопировать ваш исходный массив в другой массив, без элемента, который будет удален.
более простой способ сделать это-использовать список, набор... и использовать метод remove ().
замените элемент, который будет удален с последним элементом, если изменение размера массива вниз не представляет интереса.