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

dfi*_*ovi 18 java arraylist

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

int size = mapOverlays.size();
for(int n=1;n<size;n++)
{
    mapOverlays.remove(n);
}
Run Code Online (Sandbox Code Playgroud)

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

Ada*_*ume 102

你可以用

mapOverlays.subList(1, mapOverlays.size()).clear();
Run Code Online (Sandbox Code Playgroud)

  • +1令我难以置信的是,这不是评价最高的答案.它是最简单的代码*和*可能是最有效的(因为每个List实现将以最佳方式执行任务给定其结构). (7认同)
  • @Matthew:这取决于List的实现.对于ArrayList(至少在OpenJDK源代码中),removeRange只调用一次System.arraycopy并且不进行其他方法调用.在这种特殊情况下,它移动0个元素,因此它基本上所做的就是在紧密循环中将数组元素设置为null并更新大小字段. (3认同)
  • 神圣的废话,它在一小时内从2票变为最高评级! (2认同)

Dan*_*ann 22

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

你可以试试这个:

Object obj = mapOverlays.get(0); // remember first item
mapOverlays.clear(); // clear complete list
mapOverlays.add(obj); // add first item
Run Code Online (Sandbox Code Playgroud)

  • 这可能有效,但会导致列表进入不必要的中间状态.如果同时使用该列表(可能是CopyOnWriteArrayList),则应避免使用此解决方案. (4认同)

Pla*_*ena 7

你为什么不倒退呢?

int size = itemizedOverlay.size();
for(int n=size-1;n>0;n--)
{
    mapOverlays.remove(n);
}
Run Code Online (Sandbox Code Playgroud)

  • -1在某些List实现中,这将执行*非常*,并且它永远不会接近最佳状态. (2认同)
  • @Kevin,OP 没有使用“某些列表”。他毫不含糊地说这是一个“ArrayList”。据我所知,对于 Java 中内置的所有列表,这将是“O(n)”。这包括“LinkedList”。 (2认同)