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

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

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

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

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

你可以试试这个:

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

你可以用

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

你为什么不向后试?

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

我认为用里面的第一个元素创建一个新的ArrayList会更快。 就像是 :

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

简单。

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

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

 int size = mapOverlays.size(); for(int n=1;n 

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

removeRange受到保护太糟糕了,因为这样可以方便这种操作。

我假设mapOverlays包含一个ArrayList引用。

如果将mapOverlays声明为ListArrayList ,则mapOverlays.remove(n)将引用remove(int)方法,该方法删除给定偏移处的对象。 (到现在为止还挺好 …)

使用remove(int)数组的nth元素时,从位置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()重载,该重载将删除与其参数匹配的对象。 根据声明的类型,这将给你一个编译错误,或者int将作为一个Integer自动装箱,你(可能)不会删除任何东西。 GOTCHA!

如果您使用的是java.util.List实现而不是数组,则每次删除某些内容时,数组的大小会变小,而n+1项将替换n项。 当n变为greate而不是列表中的最后一个索引时,此代码最终将导致ArrayIndecOutOfBoundsException

Java也有一个数组类型,并且无法更改其大小:

 Object[] mapOverlay = //initialize the array here int size = mapOverlay.length; for(int n=1;n 

我不知道PHP,但这听起来像是接近你所追求的行为。 但是,List实现比数组更灵活,使用更舒适。

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

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

 int size = mapOverlays.size(); for(int n=0;n 

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