2012-07-11 116 views
3

我在這裏有一個對象的通用arraylist我想刪除某些元素,問題是當我用循環迭代列表,我不能做一個簡單的因爲元素在每次移除後發生移位,所以它們的順序爲remove()如何從Android的通用ArrayList中刪除項目(Java)

感謝

+0

您是否有要刪除的特定值可用? – 2012-07-11 09:02:49

+0

是在對象中我有一個布爾值,我必須檢查並刪除該項目 – Rakshi 2012-07-11 09:09:23

回答

12

使用Iterator刪除元素

Iterator itr = list.iterator(); 
String strElement = ""; 
while (itr.hasNext()) { 
    strElement = (String) itr.next(); 
    if (strElement.equals("2")) { 
     itr.remove(); 
    } 
} 
+0

已將鏈接更改爲指向Android Iterator。它指向以前的Java版本之前。如果你願意,隨時恢復它。 – npinti 2012-07-11 09:06:04

+0

@npinti thanx ... – 2012-07-11 09:06:31

+0

如果我必須刪除列表中的第2和第4項,則會出現問題。作爲第二項被刪除將有一個轉變 – Rakshi 2012-07-11 09:06:42

1

如果你有個對象你要從中刪除您ArrayList<T>你可以使用:

mArrayList.remove(object); 

,或者您可以使用Iterator刪除您的對象:

while(iterator.hasNext()){ 
    if(iterator.next() == some condition for removal){ 
     iterator.remove(); 
    } 
} 
+0

問題是,當我刪除列表中的任何項目將有一個班次,它會產生一個異常 – Rakshi 2012-07-11 09:15:49

0

創建索引的數據的單獨的ArrayList從刪除原始ArrayList,然後通過for循環遍歷它來移除這些元素。

ArrayList<Myobj> arr = new ArrayList<Myobj>(); 

for (Myobj o : arr){ 

    arr.remove(arr.indexOf(o)); 

} 
+0

問題是,當我刪除列表中的任何項目將會有一個移位,並且它會生成一個異常 – Rakshi 2012-07-11 09:16:05

+0

實際上您想要執行的操作,您希望從ArrayList中移除的數據中的數據或者在刪除數據後需要新形成的ArrayList的索引。 – 2012-07-11 09:28:15

+0

我需要從列表中刪除隨機對象。就像列表中有5個項目一樣,我想刪除第二個和第四個對象..您可以在下面找到解決方案。感謝您的努力 – Rakshi 2012-07-11 09:41:59

1

你可以重複向後,當你經過ArrayList中刪除。這具有隨後的元件不需要移位並且比向前移動更容易編程的優點。

List<String> arr = new ArrayList<String>(); 
    ListIterator<String> li = arr.listIterator(arr.size()); 

    // Iterate in reverse. 
    while(li.hasPrevious()) { 

     String str=li.previous(); 
     if(str.equals("A")) 
     { 
      li.remove(); 
     } 
    } 
2

可以遍歷列表這樣...

public void clean(List<Kopek> kopeks) { 
    for(Kopek kopek : kopeks) { 
    if (kopek.isDirty()) 
     kopeks.remove(kopek); 
    } 
} 

這是當量爲...

public void clean1(List<Kopek> kopeks) { 
    Iterator<Kopek> kopekIter = kopeks.iterator(); 

    while (kopekIter.hasNext()) { 
    Kopek kopek = kopekIter.next(); 
    if (kopek.isDirty()) 
     kopeks.remove(kopek); 
    } 
} 

別這樣......(由於原因你已經觀察到。)

public void clean(List<Kopek> kopeks) { 
    for(int i=0; i<kopeks.size(); i++) { 
    Kopek kopek = kopeks.get(i); 
    if (kopek.isDirty()) 
     kopeks.remove(i); 
    } 
} 

不過,我相信按索引而不是按對象清除效率更高。按對象移除效率不高,因爲列表在大多數情況下不是散列列表。

kopeks.remove(kopek);

VS

kopeks.remove(ⅰ);

爲了實現位置撈出,通過適當地處理一個移動的目標...

public void clean(List<Kopek> kopeks) { 
    int i=0; 
    while(i<kopeks.size()) { 
    Kopek kopek = kopeks.get(i); 
    if (kopek.isDirty()) // no need to increment. 
     kopeks.remove(i); 
    else 
     i++; 
    } 
} 
+0

感謝您的努力..但解決方案list.remove(object);即使dosent幫助它創建相同的異常..它更好地使用迭代器或檢查解決方案,而不使用下面的迭代器 – Rakshi 2012-07-11 09:45:04

0

不使用迭代器也解決了問題..我想要做的就是獲取要刪除的索引,並按降序排序,然後將其從列表中刪除。 檢查下面的代碼

Arraylist<obj> addlist = getlist(); 
List<Integer> indices = new ArrayList<Integer>(); 
    for(int i=0; i<addlist.size() ;i++){ 
     if(addlist.get(i).getDelete()){ 
      indices.add(i); 

     } 
    } 
    Collections.sort(indices, Collections.reverseOrder()); 
    for (int i : indices) 
     addlist.remove(i);