Удаление элемента из массива (Java)

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

Комментарии к вопросу (1)
Решение

Вы можете использовать Коммонс-Ланг'ы ArrayUtils.

array = ArrayUtils.removeElement(array, element)

commons.apache.org library:Javadocs

Комментарии (7)

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

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, и установить первоначальный размер на длину ввода. Это скорее не'т сделать много различий.

Комментарии (1)

Лучшим выбором будет использовать коллекцию, но если это по какой-то причине использовать 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 фиксированная ужасно много кода, где кто-то делал предположения, как и что.

Комментарии (5)

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

Комментарии (8)

Хорошим решением было бы использовать список вместо массива.

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)

Я думаю, что вопрос был с просьбой решения без использования 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;
}
Комментарии (2)

Вы можете использовать ArrayUtils по API, чтобы удалить его в "и приятный глазу как-то". Он реализует многие операции (удалить, найти, добавить, и т. д.) На массивах. Взгляните. Это сделало мою жизнь проще.

Комментарии (0)

Вы не можете изменить длину массива, но вы можете изменить значения Индекса проводятся путем копирования нового значения и хранить их в существующий индекс. 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;    
}
Комментарии (1)

Более некоторые предварительные условия, необходимые для тех, написанных Биллом 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;
Комментарии (0)

ладно, THX много сейчас я использую СТГ такой:

public static String[] removeElements(String[] input, String deleteMe) {
    if (input != null) {
        List list = new ArrayList(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];
    }
}
Комментарии (2)

Замените элемент, который будет удален с последнего элемента, если размер массива не заинтересованы.

Комментарии (1)

Копия ваш исходный массив в другой массив, без элемент, который будет удален.

Более простой способ сделать это-использовать список, набор... и использовать метод remove ().

Комментарии (0)

Я надеюсь, что вы используете коллекции Java, С / с коллекциями в Java общин!

С Ява.утиль.Класса ArrayList вы можете делать вещи, как следующие:

yourArrayList.remove(someObject);

yourArrayList.add(someObject);
Комментарии (10)

Используйте коллекции:

alist.remove(1); //removes the element at position 1
Комментарии (0)

Конечно, создайте другой массив :)

Комментарии (0)