簡體   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