Удаление элемента от Массива (Java) [дубликат]

Символ ! используется для расширения истории csh.

Если вы не используете эту функцию, set +o histexpand (aka set +H) отключает это поведение. Это отключено для скриптов, но часто разрешено для интерактивного использования.

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

echo "#!$SHELL"  # oops, history expansion breaks this

на

 echo '#!'"$SHELL"

(обратите внимание на соседние строки с одной кавычкой и с двойными кавычками; после того, как оболочка будет выполнена с этим, кавычки будут удалены, а строка #! будет выводиться рядом со значением переменной SHELL без пробелов между ними) или рядом других общих обходных путей, таких как

 printf '#!%s\n' "$SHELL"
140
задан Michael Myers 13 March 2009 в 14:34
поделиться

13 ответов

Вы могли использовать Ленга свободного городского населения ArrayUtils.

array = ArrayUtils.removeElement(array, element)

commons.apache.org library:Javadocs

232
ответ дан 4 November 2019 в 09:09
поделиться

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

-6
ответ дан 4 November 2019 в 09:09
поделиться

Используйте ArrayList:

alist.remove(1); //removes the element at position 1
-3
ответ дан 4 November 2019 в 09:09
поделиться

Я надеюсь, что Вы используете набор Java / наборы свободного городского населения Java!

С java.util. ArrayList можно сделать вещи как следующее:

yourArrayList.remove(someObject);

yourArrayList.add(someObject);
0
ответ дан 4 November 2019 в 09:09
поделиться

Подкачайте объект, который будет удален с последним объектом, если изменение размеров массива вниз не является интересом.

0
ответ дан 4 November 2019 в 09:09
поделиться

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

А simplier способ сделать, который должен использовать Список, Набор... и использовать удаление () метод.

0
ответ дан 4 November 2019 в 09:09
поделиться

хорошо, большое спасибо теперь я использую 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];
    }
}
1
ответ дан 4 November 2019 в 09:09
поделиться

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

4
ответ дан 4 November 2019 в 09:09
поделиться

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

37
ответ дан 4 November 2019 в 09:09
поделиться

Симпатичное решение состояло бы в том, чтобы использовать Список вместо массива во-первых.

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.)

14
ответ дан 4 November 2019 в 09:09
поделиться

Лучший выбор состоял бы в том, чтобы использовать набор, но если это отсутствует по некоторым причинам, используйте arraycopy . Можно использовать его для копирования от и до того же массива при немного отличающемся смещении.

, Например:

public void removeElement(Object[] arr, int removedIdx) {
    System.arraycopy(arr, removedIdx + 1, arr, removedIdx, arr.length - 1 - removedIdx);
}
<час>

Редактирование в ответ на комментарий:

Это не иначе, это - действительно единственный приемлемый путь - любые инструменты, которые позволяют эту функциональность (как Java. ArrayList или апачский utils), будет использовать этот метод под покрытиями. Кроме того, ДЕЙСТВИТЕЛЬНО необходимо использовать ArrayList (или связанный список, если Вы удаляете с середины много), таким образом, это не должно даже быть проблемой, если Вы не делаете его как домашнюю работу.

Для выделения набора (создает новый массив) затем удалите элемент (который набор сделает использование arraycopy), тогда звонят, toArray на нем (создает ВТОРОЙ новый массив) для каждого удалять, приносит нам до такой степени, когда, это не проблема оптимизации, это преступно плохо программирует.

предположим у Вас был массив, поднимающий, скажем, 100 МБ поршня. Теперь Вы хотите выполнить итерации по нему и удалить 20 элементов.

Дают ему попытку...

я знаю, что Вы ПРЕДПОЛАГАЕТЕ, что это не будет этим большим, или что при удалении этого многие сразу, Вы кодировали бы его по-другому, но я зафиксировал очень много кода, где кто-то сделал предположения как этот.

42
ответ дан 4 November 2019 в 09:09
поделиться

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

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 являются пустыми; пустой список на пустом входе списка не имеет смысла. Удаление пустых строк от массива могло бы иметь смысл, но я оставлю это как осуществление также; в настоящее время это бросит NPE, когда это попытается звонить, равняется на deleteMe, если deleteMe является пустым.)

Выбор я сделал здесь:

я использовал LinkedList. Повторение должно быть столь же быстрым, и Вы избегаете, чтобы любой изменил размеры, или выделение слишком большого из списка, если Вы заканчиваете тем, что удалили много элементов. Вы могли использовать ArrayList и установить начальный размер на длину входа. Это, вероятно, не имело бы большую часть значения.

47
ответ дан 4 November 2019 в 09:09
поделиться

Я думаю, что вопрос был направлен на поиск решения без использования API Collections. Массивы используются либо для деталей низкого уровня, где важна производительность, либо для интеграции SOA. В последнем случае их можно преобразовать в Collections и передать бизнес-логике в таком виде.

Что касается низкоуровневых деталей производительности, то они обычно уже замутнены быстрым и грязным императивным перемешиванием состояний с помощью циклов for и т.п. В этом случае преобразование туда-сюда между коллекциями и массивами громоздко, нечитаемо и даже ресурсоемко.

Кстати, 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;
}
10
ответ дан 4 November 2019 в 09:09
поделиться
Другие вопросы по тегам:

Похожие вопросы: