Есть ли какой-нибудь быстрый (и красивый) способ удалить элемент из массива в Java?Удаление элемента из массива (Java)
ответ
Вы можете использовать ArrayUtils Общин Ланга.
array = ArrayUtils.removeElement(array, element)
Есть ли эквивалент Guava? –
@Clive Guava, похоже, работает только с коллекциями. –
ли это также сокращает массив? –
Вы не можете удалить элемент из базового массива Java. Посмотрите на различные коллекции и ArrayList.
Я знаю, я просто хочу красиво смотреть путь с arraylists или sth. как это, любой намек на это? – Tobias
+1: Используйте LinkedList, жизнь проще. –
LinkedList редко является хорошей идеей. Список intrrface предоставляет вам произвольный доступ, но LinkedList дает O (n) время доступа вместо O (1). –
Конечно, создать еще один массив :)
ищет решение Nice будет использовать список вместо массива в первую очередь.
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
.)
+1: Используйте LinkedList или ArrayList. –
Используйте ArrayList
:
alist.remove(1); //removes the element at position 1
Я надеюсь, что вы используете коллекции коллекции java/java commons!
С java.util.ArrayList вы можете сделать что-то вроде следующего:
yourArrayList.remove(someObject);
yourArrayList.add(someObject);
Copy исходный массив в другой массив, без элемента, который будет удален.
Простейший способ сделать это - использовать List, Set ... и использовать метод remove().
Приобретите элемент для удаления с последним элементом, если изменение размера массива не представляет интереса.
Это сломает вещи, если массив был отсортирован до удаления. – eleven81
хорошо, ТНХ много теперь я использовать н, как это:
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];
}
}
Если вам действительно нужно оставить массив inital неизменным, лучше создать пустой список и заполнить его правильными элементами, а не делать это таким образом. – Nicolas
Я не уверен, что это то, что люди имели в виду, когда предлагали использовать коллекции, но, во всяком случае, будьте осторожны с этими индексами списка. Похоже, вы пропускаете элемент сразу после удаления (попробуйте {"a", "b", "deleteMe", "deleteMe", "c"}). –
Лучший выбор должен был бы использовать коллекцию, но если это за какой-либо причине, используйте arraycopy
. Вы можете использовать его для копирования из одного и того же массива с немного другим смещением.
Например:
public void removeElement(Object[] arr, int removedIdx) {
System.arraycopy(arr, removedIdx + 1, arr, removedIdx, arr.length - 1 - removedIdx);
}
Редактировать в ответ на комментарий:
Это не еще один хороший способ, это действительно единственный приемлемый способ.
Чтобы выделить коллекцию (создайте новый массив), затем удалите элемент (который будет делать коллекция с использованием arraycopy), затем вызовите toArray на нем (создайте второй новый массив) для каждого удаления приведет нас к тому, не проблема оптимизации, это криминально плохое программирование.
Предположим, что у вас был массив, например, 100 мб. Теперь вы хотите перебрать его и удалить 20 элементов.
Дайте ему попробовать ...
Я знаю, что вы предполагаете, что это не будет такой большой, или если вы удалите, что многие сразу вы его код по-другому, но я фиксированной очень много кода, где кто-то сделал такие предположения.
После «удаления» (т. Е. Смещения массива, оставленного одним элементом) не будет ли дубликат конечного элемента? т. е. длина будет одинаковой после удаления, нет? Я не говорю, что мне не нравится идея, просто нужно знать об этом. – Adamski
+1. Это работает для моих целей. (Я исправил небольшую проблему, имевшуюся в вашем примере. Надеюсь, вы не против.) – Gunslinger47
Да, это просто сдвинет элементы влево, и останется последний элемент. Мы должны использовать новый массив для копирования. – Reddy
Ваш вопрос не очень ясен. Из вашего собственного ответа я могу лучше сказать, что вы пытаетесь сделать:
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, если ввод или deleteMe равен NULL, пустой список для ввода нулевого списка не имеет смысла. Удаление нулей Строки из массива могут иметь смысл, оставлю это упражнение тоже, в настоящее время, он будет бросать NPE, когда он пытается вызвать равно на DeleteMe если DeleteMe равно нулю)
выбор я сделал здесь:
Я использовал LinkedList.. Итерация должна быть такой же быстрой, и вы избегаете любых изменений или выделяете слишком большой список, если в итоге вы удалите множество элементов. Вы можете использовать ArrayList и установить начальный размер на длину ввода. Вероятно, это не будет иметь большого значения.
Обратите внимание, что вам нужно использовать 'List
Вы можете использовать ArrayUtils API, чтобы удалить его «красивым способом». Он реализует множество операций (удалить, найти, добавить, содержит и т. Д.) В массивы.
Посмотрите. Это упростило мою жизнь.
Я думаю, что вопрос запрашивал решение без использования использования API коллекций. Один использует массивы либо для деталей низкого уровня, где важна производительность, либо для слабосвязанной интеграции SOA. В более позднем варианте это нормально, чтобы преобразовать их в Коллекции и передать их бизнес-логике.
Для низкоуровневых характеристик обычно он уже запутывается быстрым и грязным императивным сочетанием состояний для циклов и т. Д. В этом случае преобразование между коллекциями и массивами является громоздким, нечитаемым и даже ресурсоемких.
Кстати, TopCoder, кто-нибудь? Всегда эти параметры массива! Поэтому будьте готовы быть в состоянии справиться с ними, когда на арене.
Ниже представлена моя интерпретация проблемы и решение. Он отличается по функциональности от тех, которые указаны в таблице . Билл 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;
}
Это прекрасно работает. – Reddy
Отлично. Слишком много ответов, отвечая на другой вопрос OP. –
Некоторые более предварительные условия необходимы для тех, написанных Биллом K и dadinn
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 = mike, 2 = jeff // 10 = george 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;
}
Я думаю, указывая, что длина массива не может быть изменена - важная деталь! –
Даже если вопрос повторяющийся, ответ в другом вопросе не является ни быстрым, ни приятным. Преобразует массив в arraylist (вручную). – f1v3