[英]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
聲明為List
或ArrayList
,則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.