繁体   English   中英

如何从 Java 中的 ArrayList 中删除除第一个元素之外的所有内容

[英]How to remove everything from an ArrayList in Java but the first element

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

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

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

你可以用

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

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

你可以试试这个:

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

你为什么不向后尝试?

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受到保护,因为这对于此类操作来说很方便。

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

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

简单的。

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

我假设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(<E>)重载,该重载将删除与其参数匹配的对象。 根据声明的类型,这可能会给您带来编译错误,或者将int自动装箱为Integer并且您(可能)不会删除任何内容。 GOTCHA!

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

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

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

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

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

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

编辑(见亚当克鲁姆的评论)

如果性能是一个问题,你应该使用这个

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

甚至有点微优化

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



如果性能确实是一个问题(并且列表有很多元素),您应该使用sublist解决方案。 如果无法重新创建列表实例(在其他地方引用),则阅读起来有点困难,但可能是最快的解决方案。

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM