Есть ли какой-нибудь быстрый (и красивый) способ удалить элемент из массива в Java?
Удаление элемента из массива (Java)
Ответ 1
Вы можете использовать commons lang ArrayUtils.
array = ArrayUtils.removeElement(array, element)
Ответ 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, если ввод или deleteMe равен NULL, пустой список для ввода нулевого списка не имеет смысла. Удаление нулей Строки из массива могут иметь смысл, оставим это как упражнение тоже, в настоящее время он будет бросать NPE, когда он пытается называть equals на 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), будут использовать этот метод под прикрытием. Кроме того, вы ДЕЙСТВИТЕЛЬНО должны использовать ArrayList (или связанный список, если вы много удаляете из середины), так что это не должно быть проблемой, если вы не делаете это в качестве домашней работы.
Чтобы выделить коллекцию (создает новый массив), затем удалить элемент (который коллекция будет делать с помощью arraycopy), а затем вызвать toArray для него (создает ВТОРОЙ новый массив) для каждого удаления, что приводит нас к точке, где это не является проблемой оптимизации, это преступно плохое программирование.
Предположим, у вас есть массив, занимающий, скажем, 100 МБ ОЗУ. Теперь вы хотите перебрать его и удалить 20 элементов.
Попробуйте...
Я знаю, что вы ПРИНИМАЕТЕ, что он не будет таким большим или что, если вы удаляете столько раз за раз, вы закодируете его по-другому, но я исправил очень много кода, где кто-то делал подобные предположения.
Ответ 4
Вы не можете удалить элемент из базового массива Java. Взгляните на различные коллекции и ArrayList.
Ответ 5
Хорошим решением будет использовать List вместо массива, в первую очередь.
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
.)
Ответ 6
Я думаю, что вопрос требует разрешения без использования API коллекций. Один использует массивы либо для деталей низкого уровня, где важна производительность, либо для слабосвязанной интеграции SOA. В более поздних версиях, это нормально, чтобы преобразовать их в Коллекции и передать их бизнес-логике как таковой.
Для низкоуровневого уровня производительности он обычно уже запутывается быстрым и грязным императивным сочетанием состояний для циклов и т.д. В этом случае преобразование между коллекциями и массивами является громоздким, нечитаемым и даже ресурсоемкий.
Кстати, TopCoder, кто-нибудь? Всегда эти параметры массива! Поэтому будьте готовы быть в состоянии справиться с ними, когда на арене.
Ниже моя интерпретация проблемы и решение. Он отличается по функциональности от тех, которые заданы Bill K и 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;
}
Ответ 7
Вы можете использовать ArrayUtils API, чтобы удалить его "красивым способом". Он реализует множество операций (удалить, найти, добавить, содержит и т.д.) На массивы.
Взглянуть. Это упростило мою жизнь.
Ответ 8
Для Билла К и Дадинна требуются дополнительные предварительные условия
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;
Ответ 9
Вы не можете изменить длину массива, но вы можете изменить значения индекса, скопировав новые значения и сохранив их под существующим индексным номером. 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;
}
Ответ 10
в порядке, спасибо много теперь я использую 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];
}
}
Ответ 11
Надеюсь, вы используете коллекцию java collection/java commons!
С помощью java.util.ArrayList вы можете сделать следующее:
yourArrayList.remove(someObject);
yourArrayList.add(someObject);
Ответ 12
Copy ваш исходный массив в другой массив без элемента, который нужно удалить.
Более простой способ сделать это - использовать List, Set... и использовать метод remove().
Ответ 13
Смените элемент, который нужно удалить, с последним элементом, если изменение размера массива не представляет интереса.
Ответ 14
Используйте ArrayList
:
alist.remove(1); //removes the element at position 1
Ответ 15
Конечно, создайте еще один массив:)