Я плохо знаком с программированием Java, программированием в php, таким образом, я привык к этому типу цикла:
int size = mapOverlays.size();
for(int n=1;n<size;n++)
{
mapOverlays.remove(n);
}
Таким образом, я хочу удалить все кроме первого объекта, итак, почему это не работает? Поскольку я получаю его, после того, как удаление, ключи массива будут перестроены или нет?
Как я понял, после удаления ключи массива переставляются или нет? Да, элемент, который был на позиции 2, находится на позиции 1 после того, как вы удалили элемент на позиции 1.
Вы можете попробовать следующее:
Object obj = mapOverlays.get(0); // remember first item
mapOverlays.clear(); // clear complete list
mapOverlays.add(obj); // add first item
Простой.
mapOverlays = Collections.singletonList(mapOverlays.get(0));
Why don't you try backwards?
int size = itemizedOverlay.size();
for(int n=size-1;n>0;n--)
{
mapOverlays.remove(n);
}
ArrayList
имеет целочисленные индексы от 0 до size () - 1
. Вы могли бы сделать:
int size = mapOverlays.size();
for(int n=1;n<size;n++)
{
mapOverlays.remove(1);
}
Вероятно, это соответствует тому, что вы ожидаете от PHP. Он работает, постоянно удаляя 1-й элемент, который изменяется. Однако это имеет низкую производительность, так как внутренний массив должен постоянно смещаться вниз. Лучше использовать clear ()
или действовать в обратном порядке.
Жаль, что removeRange
защищен, так как это было бы удобно для такого типа операций.
Вы можете использовать
mapOverlays.subList(1, mapOverlays.size()).clear();
Используйте цикл 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
. Это немного сложнее для чтения, но, вероятно, самое быстрое решение, если экземпляр списка не может быть воссоздан (ссылка в другом месте).
int size = mapOverlays.size();
for(int n=0;n<size;n++)
{
mapOverlays.remove(n);
}
В java, если mapOverlays - список, то он начинается с 0 в качестве первого индекса. Поэтому n=0 в цикле for.
Я предполагаю, что 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!
Думаю, было бы быстрее создать новый список ArrayList с первым элементом внутри. что-то вроде:
E temp = mapOverlays.get(0);
mapOverlays = new ArrayList<E>().add(temp);
Если вы используете реализацию 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
Используйте коллекции google и Lists.limit http://guava-libraries.googlecode.com/svn/trunk/javadoc/com/google/common/collect/Iterables.html#limit(java.lang.Iterable, int)