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

如何在Java中删除ArrayList中除第一个元素以外的所有内容,java,arraylist,Java,Arraylist,我是java编程新手,一直在用php编程,所以我习惯了这种类型的循环: int size = mapOverlays.size(); for(int n=1;n<size;n++) { mapOverlays.remove(n); } int size=mapOverlays.size(); 对于(int n=1;n 据我所知,移除后,数组键是否重新排列? 是,移除位置1上的项目后,位置2上的项目位于位置1上 您可以尝试以下方法: Object obj = mapOverlays

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

int size = mapOverlays.size();
for(int n=1;n<size;n++)
{
    mapOverlays.remove(n);
}
int size=mapOverlays.size();
对于(int n=1;n
据我所知,移除后,数组键是否重新排列?
是,移除位置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);
}
int size=mapOverlays.size();
对于(int n=1;nSimple

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

我认为创建一个只包含第一个元素的新ArrayList会更快。类似于:

E temp = mapOverlays.get(0);
mapOverlays = new ArrayList<E>().add(temp);
E temp=mapOverlays.get(0);
mapOverlays=新建ArrayList().add(临时);

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

Java还有一个数组类型,该类型的大小不能更改:

Object[] mapOverlay = //initialize the array here
int size = mapOverlay.length;
for(int n=1;n<size;n++)
{
    mapOverlay[n] = null;
}
Object[]mappoverlay=//在此处初始化数组
int size=mappoverlay.length;
对于(int n=1;n您可以使用

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

对于(int n=0;n使用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;
}


如果性能确实是一个问题(列表中有很多元素),那么您应该使用
子列表解决方案。如果列表实例无法重新创建(在别处引用),它会更难阅读,但可能是最快的解决方案。

使用google collections 及 列表.限制 ,int)

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



据我所知,您正在选择一个名为itemizedOverlay的列表的大小,然后处理另一个名为mapOverlays的列表。我希望这是正常的;-)很抱歉,输入错误,数组是相同的,我编辑了顺便说一句,Daniel的建议可能更好,因为它不创建新对象。因此对对象的引用保留。
add
返回一个
boolean
,因此您不能执行
mapOverlays=newArrayList().add(temp);
您需要两个语句,
mapOverlays=newArrayList();
映射覆盖。添加(临时)
可能不是OP想要的-结果列表只有第一个元素,但您不能再向其中添加任何内容。因此,这不是一个错误的答案,但它引入了一些限制。+1用于指出潜在解决方案的性能缺点。此外……请记住,您始终可以扩展ArrayList并公开任何方法您不需要
removeRange
(问题不是它受到保护,而是它甚至不存在于
列表
界面上(这是正确的))。请看Adam Crune的回答。@Kevin,OP没有使用
列表
接口,因此这是一个非Sequeur。你可以说他应该这样做,但也许他确定他明确希望基于数组的类具有性能特征。我想OP希望保留列表中的第一个元素,并删除所有其他元素。+1这简直令人难以置信对我来说,这不是评级最高的答案。它既是最简单的代码,也可能是最有效的(因为每个列表实现都将以其结构的最佳方式执行任务)。天哪,它在一个小时内从2票上升到了最高评分!这是一种很有用的编写方法。但是,如果你真的看一下代码,它使用了受保护的
removeRange
,基本上做了与Plamena解决方案完全相同的事情。主要区别在于方法调用的数量,以及循环的位置。具有良好的JIT,我怀疑它们的性能相当相似。显然,大O是相同的。@Matthew:这取决于列表实现。对于ArrayList(至少在OpenJDK源代码中),removeRange只调用System.arraycopy一次,不进行任何其他方法调用。在这种情况下,它移动0个元素,因此基本上只需在紧循环中将数组元素设置为null并更新大小字段。-1在某些列表实现中,这将执行得非常糟糕,而且永远不会接近最优。@Kevin,OP不是使用“一些列表”。他毫不含糊地说这是一个
ArrayList
。据我所知,对于Java中内置的所有列表,这将是
O(n)
。这包括
LinkedList
。这可能会起作用,但会导致列表进入不必要的中间状态。如果同时使用该列表(可能是CopyOnWriteArrayList),您应该避免使用此解决方案。对于ArrayList,这将执行得非常糟糕-O(n^2)时间-因为它几乎需要对整个数组调用System.arraycopy n-1次。删除最后一个元素而不是索引1处的元素,应该会更好。@Adam-正确,答案经过编辑,也许
Remove(1)
解决方案仍然比O(n^2)差,但我更喜欢小列表,以便更具可读性(IMO)-问题根本就没有提到性能。
子列表
解决方案优雅且更好(最好),但并非所有人都了解
子列表
的工作原理。我不在乎人们是否不使用子列表。我只是认为,将运行时从O(n^2)减少到O(n)值得对可读性做出小小牺牲。
删除(1)
解决方案可能适用于小列表,但我认为最好有适用于任何列表的代码。
int last = mapOverlays.size() - 1;
while (last >= 1) {
    mapOverlays.remove(last);
    last -= 1;
}
while( mapOverlays.size() > 1 ) {
  mapOverlays.remove( mapOverlays.size() - 1 );
}