Есть ли какой-нибудь быстрый (и красивый на вид) способ удалить элемент из массива в Java?
Вы можете использовать Коммонс-Ланг'ы ArrayUtils.
array = ArrayUtils.removeElement(array, element)
Ваш вопрос Это'т очень понятно. Из своего собственного ответа, я могу сказать лучше того, что вы пытаетесь сделать:
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: это не проверялось. Проверка на ошибки оставлено в качестве упражнения для читателя (Я'd не бросит IllegalArgumentException если какой-либо входной или deleteMe нуль; пустой список, пустой список на вход не'т смысл. Удаление нулевых строк из массива может иметь смысл, но я'МР оставлю это в качестве упражнения слишком; в настоящее время он будет бросить NPE при попытке позвонить на равных deleteMe если deleteMe имеет значение null.)
Выбор я сделал здесь:
Я использовал LinkedList не. Итерации должны быть так же быстро, и вы избежите любых размеров, или выделение слишком большой список, если вы в конечном итоге удаление много элементов. Вы могли бы использовать ArrayList, и установить первоначальный размер на длину ввода. Это скорее не'т сделать много различий.
Лучшим выбором будет использовать коллекцию, но если это по какой-то причине использовать arraycopy
. Вы можете использовать его для копирования и в то же время немного отличается от офсетной.
Например:
public void removeElement(Object[] arr, int removedIdx) {
System.arraycopy(arr, removedIdx + 1, arr, removedIdx, arr.length - 1 - removedIdx);
}
Редактировать в ответ на комментарий:
Это's Не еще один хороший способ, это's действительно единственный приемлемый способ-любые инструменты, которые позволяют эту функцию (например, Java.ArrayList или Апач утилит) будет использовать этот метод под одеялом. Также, вы действительно должны использовать ArrayList С (или связанный список, если вы удалите из середины много) так что это стоило'т быть проблемой, если вы делаете это в качестве домашнего задания.
Выделить коллекцию (создает новый массив), затем удалить элемент (который сбор будет сделать с помощью arraycopy) тогда позвоните toArray в него (создает новый массив) для каждого удалить подводит нас к точке, где это's не в оптимизации проблема, это'ы преступно плохого программирования.
Предположим, что у вас массив, занимая, скажем, 100 МБ оперативной памяти. Теперь вам нужно перебрать и удалить 20 элементов.
Дайте ему попробовать...
Я знаю, ты думаешь, что это's не собирается быть таким, или что если вы начали удалять, что много за один раз вы'd в код это по-разному, но я've фиксированная ужасно много кода, где кто-то делал предположения, как и что.
Вы не можете удалить элемент из основного массива Java. Вместо этого рассмотрите различные Collections и 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 коллекций. Кто-то использует массивы либо на низкоуровневых деталях, где вопросы производительности, или для слабосвязанной интеграции СОА. В дальнейшем, это ОК, чтобы преобразовать их в коллекции и передать их бизнес-логике, как и что.
Низкий уровень производительности вещи, это, как правило, уже затуманено быстрый-и-грязный императив государства-смешиваясь ПО для петель и т. д. В этом случае преобразования взад и вперед между коллекциями и массивами громоздко, нечитабельно, и даже ресурсов.
Кстати, Топкодере, кто? Всегда такими параметрами! Так что будьте готовы к тому, чтобы справиться с ними, когда на арене.
Ниже-мое видение проблемы и решения. Она отличается по функциональности от обоих, какой дал Билл К и 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, чтобы удалить его в "и приятный глазу как-то". Он реализует многие операции (удалить, найти, добавить, и т. д.) На массивах. Взгляните. Это сделало мою жизнь проще.
Вы не можете изменить длину массива, но вы можете изменить значения Индекса проводятся путем копирования нового значения и хранить их в существующий индекс. 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;
}
Более некоторые предварительные условия, необходимые для тех, написанных Биллом 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;
ладно, THX много сейчас я использую СТГ такой:
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 ().
Используйте коллекции
:
alist.remove(1); //removes the element at position 1