Как удалить все из ArrayList в Java кроме первого элемента

Я плохо знаком с программированием Java, программированием в php, таким образом, я привык к этому типу цикла:

int size = mapOverlays.size();
for(int n=1;n<size;n++)
{
    mapOverlays.remove(n);
}

Таким образом, я хочу удалить все кроме первого объекта, итак, почему это не работает? Поскольку я получаю его, после того, как удаление, ключи массива будут перестроены или нет?

18
задан user85421 23 June 2010 в 07:44
поделиться

11 ответов

Как я понял, после удаления ключи массива переставляются или нет? Да, элемент, который был на позиции 2, находится на позиции 1 после того, как вы удалили элемент на позиции 1.

Вы можете попробовать следующее:

Object obj = mapOverlays.get(0); // remember first item
mapOverlays.clear(); // clear complete list
mapOverlays.add(obj); // add first item
22
ответ дан 30 November 2019 в 05:37
поделиться

Простой.

mapOverlays = Collections.singletonList(mapOverlays.get(0));
2
ответ дан 30 November 2019 в 05:37
поделиться

Why don't you try backwards?

int size = itemizedOverlay.size();
for(int n=size-1;n>0;n--)
{
    mapOverlays.remove(n);
}
7
ответ дан 30 November 2019 в 05:37
поделиться

ArrayList имеет целочисленные индексы от 0 до size () - 1 . Вы могли бы сделать:

int size = mapOverlays.size();
for(int n=1;n<size;n++)
{
    mapOverlays.remove(1);
}

Вероятно, это соответствует тому, что вы ожидаете от PHP. Он работает, постоянно удаляя 1-й элемент, который изменяется. Однако это имеет низкую производительность, так как внутренний массив должен постоянно смещаться вниз. Лучше использовать clear () или действовать в обратном порядке.

Жаль, что removeRange защищен, так как это было бы удобно для такого типа операций.

2
ответ дан 30 November 2019 в 05:37
поделиться

Вы можете использовать

mapOverlays.subList(1, mapOverlays.size()).clear();
102
ответ дан 30 November 2019 в 05:37
поделиться

Используйте цикл while для удаления всего после первого элемента:

while (mapOverlays.size() > 1) {
    mapOverlays.remove(1);
}

EDIT (см. комментарий от Adam Crume)

Если производительность является проблемой, используйте этот вариант

while (mapOverlays.size() > 1) {
    mapOverlays.remove(mapOverlays.size()-1);
}

даже немного микрооптимизации

int last = mapOverlays.size() - 1;
while (last >= 1) {
    mapOverlays.remove(last);
    last -= 1;
}



Если производительность действительно является проблемой (и список имеет много элементов), используйте решение sublist. Это немного сложнее для чтения, но, вероятно, самое быстрое решение, если экземпляр списка не может быть воссоздан (ссылка в другом месте).

0
ответ дан 30 November 2019 в 05:37
поделиться
int size = mapOverlays.size();
for(int n=0;n<size;n++)
{
    mapOverlays.remove(n);
}

В java, если mapOverlays - список, то он начинается с 0 в качестве первого индекса. Поэтому n=0 в цикле for.

0
ответ дан 30 November 2019 в 05:37
поделиться

Я предполагаю, что mapOverlays содержит ссылку ArrayList .

Если mapOverlays объявлен как List или ArrayList , то mapOverlays.remove (n) будет ссылаться на ] remove (int) метод, который удаляет объект по заданному смещению. (Пока все хорошо ...)

Когда вы удаляете n-й элемент массива с помощью remove (int) , элементы, начинающиеся с позиции n + 1 и, прежде всего, перемещаются на единицу вниз. Так что в большинстве случаев то, что вы делаете, на самом деле не сработает. (Фактически, вы, вероятно, удалите примерно половину элементов, которые хотите удалить, а затем получите исключение IndexOutOfBoundsException .)

Лучшее решение:

    for (int i = size - 1; i > 0; i--) {
        mapOverlays.remove(i);
    }

или

    tmp = mapOverlays.remove(0);
    mapOverlays.clear();
    mapOverlays.add(tmp);

(Примечание что первое решение всегда удаляет из конца списка, избегая необходимости копировать элементы, чтобы заполнить дыру, оставленную удаленным элементом. Различия в производительности значительны для большого ArrayList.)

Однако, если mapOverlays объявлен как Коллекция , remove (n) будет привязан к перегрузке remove () , которая удаляет объект, соответствующий его аргумент. В зависимости от объявленного типа это либо приведет к ошибке компиляции, либо int будет автоматически упаковано как Integer , и вы (вероятно) ничего не удалите. GOTCHA!

1
ответ дан 30 November 2019 в 05:37
поделиться

Думаю, было бы быстрее создать новый список ArrayList с первым элементом внутри. что-то вроде:

E temp = mapOverlays.get(0);
mapOverlays = new ArrayList<E>().add(temp);
4
ответ дан 30 November 2019 в 05:37
поделиться

Если вы используете реализацию java.util.List вместо массива, размер массива уменьшается каждый раз, когда вы что-то удаляете, и n + 1 Элемент заменяет элемент n . Этот код в конечном итоге приведет к исключению ArrayIndecOutOfBoundsException , когда n станет более крупным, чем последний индекс в списке.

В Java также есть тип массива, размер которого нельзя изменить:

Object[] mapOverlay = //initialize the array here
int size = mapOverlay.length;
for(int n=1;n<size;n++)
{
    mapOverlay[n] = null;
}

Я не знаю PHP, но похоже, что это похоже на то, что вам нужно. Однако реализации List более гибкие и удобные в использовании, чем массивы.

РЕДАКТИРОВАТЬ: Вот ссылка на Javadoc List.remove (int) : http://java.sun.com/javase/6/docs/api/java/util/ List.html # remove% 28int% 29

0
ответ дан 30 November 2019 в 05:37
поделиться
0
ответ дан 30 November 2019 в 05:37
поделиться
Другие вопросы по тегам:

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