如何从Java中的ArrayList中删除所有内容,但是第一个元素

时间:2010-06-23 06:58:55

标签: java arraylist

我是java编程的新手,在php中编程所以我习惯了这种类型的循环:

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

所以我想删除除第一项之外的所有内容,为什么这不起作用?我得到它,删除后,数组键是否重新排列?

12 个答案:

答案 0 :(得分:97)

您可以使用

mapOverlays.subList(1, mapOverlays.size()).clear();

答案 1 :(得分:22)

  

我得到它,删除后,数组键是否重新排列?   是的,在您移除位置1上的项目后,位置2上的项目位于第1位。

你可以试试这个:

Object obj = mapOverlays.get(0); // remember first item
mapOverlays.clear(); // clear complete list
mapOverlays.add(obj); // add first item

答案 2 :(得分:7)

你为什么不向后试?

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

答案 3 :(得分:4)

我认为用里面的第一个元素创建一个新的ArrayList会更快。类似的东西:

E temp = mapOverlays.get(0);
mapOverlays = new ArrayList<E>().add(temp);

答案 4 :(得分:2)

ArrayList具有从0到size() - 1的整数索引。你可以这样做:

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

这可能与您对PHP的期望相符。它通过不断删除改变的第1个元素来工作。但是,由于内部阵列必须不断向下移动,因此性能较差。最好使用clear()或以相反的顺序运行。

太糟糕removeRange受到保护,因为这样可以方便进行此类操作。

答案 5 :(得分:2)

简单。

mapOverlays = Collections.singletonList(mapOverlays.get(0));

答案 6 :(得分:1)

我假设mapOverlays持有ArrayList引用。

如果mapOverlays被声明为ListArrayList,则mapOverlays.remove(n)将引用在给定偏移处移除对象的remove(int)方法。 (到目前为止一直很好......)

当您使用nth删除数组的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声明为Collection,则remove(n)将绑定到remove(<E>)重载,从而删除与其参数匹配的对象。根据声明的类型,这将导致编译错误,或int将自动装箱为Integer,您(可能)将不会删除任何内容。的 GOTCHA!

答案 7 :(得分:0)

如果使用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实现比数组更灵活,使用更舒适。

编辑:这是指向List.remove(int)的Javadoc的链接:http://java.sun.com/javase/6/docs/api/java/util/List.html#remove%28int%29

答案 8 :(得分:0)

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

在java中,如果mapOverlays是list,那么它从0开始作为第一个索引。在for循环中,n = 0。

答案 9 :(得分:0)

使用while循环删除第一个元素后的所有内容:

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

编辑(请参阅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解决方案。如果无法重新创建列表实例(在其他地方引用),那么阅读起来有点难,但可能是最快的解决方案。

答案 10 :(得分:0)

答案 11 :(得分:0)

因为在 ArrayList 第一个元素的索引为 0
在 Java 中,正确的方法是:

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