2012-05-23 181 views
79

我有一個ArrayList假設list,它有8個項目A-H,現在我想刪除1,3,5位置物品存儲在int數組list我怎麼能做到這一點。從ArrayList刪除項目

我試圖用

ArrayList<String> list = new ArrayList<String>(); 
list.add("A"); 
list.add("B"); 
list.add("C"); 
list.add("D"); 
list.add("E"); 
list.add("F"); 
list.add("G"); 
list.add("H"); 

int i[] = {1,3,5}; 

for (int j = 0; j < i.length; j++) { 
    list.remove(i[j]); 
} 

這樣做,但之後的第一個項目刪除的定位陣列的改變,並且在接下來的迭代它刪除錯誤的元素或給予例外。

+1

你的邏輯是有缺陷的。當然,你不應該考慮每件物品的位置,而應該考慮物品本身。換句話說,你不想刪除位置1,3和5,而是想要使用equals(「B」)','equals(「D 「)'和'equals(」F「)'。想想看。 – Squonk

+0

是的我想刪除項目,但我怎麼能匹配項目。其實實際上這個項目是在ListView和選擇我想從DB和數組中刪除它,刷新適配器和列表 –

+0

如何刪除索引的降序(排序索引,然後刪除索引最高索引元素)? – nhahtdh

回答

107

在這種特殊情況下,您應該按降序刪除元素。首先索引5,然後3,然後1。這將刪除列表中的元素,但不會產生不良副作用。

for (int j = i.length-1; j >= 0; j--) { 
    list.remove(i[j]); 
} 
+0

當ArrayList是整數時,此概念錯誤。 –

+1

OP的ArrayList包含'String's,而不是'Integer's(儘管如此,我同意你的觀察)。 –

+0

@亞歷克斯:這個答案會起作用,但與OP在他們的問題中的邏輯一樣有缺陷。我們正在討論'ArrayList ' - 爲什麼有人想從基於位置的ArrayList中移除一個對象,而不是測試那個位置的內容? OP很可能使用'String'作爲'ArrayList'的對象類型,但是您的答案對於泛型編程實踐是非常糟糕的,即使它確實解決了OP的特定情況。 – Squonk

4
String[] mString = new String[] {"B", "D", "F"}; 

for (int j = 0; j < mString.length-1; j++) { 
     List_Of_Array.remove(mString[j]); 
} 
2

這個怎麼樣?只要給它一個以爲 -

import java.util.ArrayList; 

class Solution 
{ 
     public static void main (String[] args){ 

      ArrayList<String> List_Of_Array = new ArrayList<String>(); 
      List_Of_Array.add("A"); 
      List_Of_Array.add("B"); 
      List_Of_Array.add("C"); 
      List_Of_Array.add("D"); 
      List_Of_Array.add("E"); 
      List_Of_Array.add("F"); 
      List_Of_Array.add("G"); 
      List_Of_Array.add("H"); 

      int i[] = {1,3,5}; 

      for (int j = 0; j < i.length; j++) { 
       List_Of_Array.remove(i[j]-j); 
      } 

      System.out.println(List_Of_Array); 

     } 


} 

和輸出是 -

[A, C, E, G, H] 
27

可以使用ListIterator刪除ArrayList元素,

ListIterator listIterator = List_Of_Array.listIterator(); 

/* Use void remove() method of ListIterator to remove an element from List. 
    It removes the last element returned by next or previous methods. 
*/ 
listIterator.next(); 

//remove element returned by last next method 
listIterator.remove();//remove element at 1st position 
listIterator.next(); 
listIterator.next(); 
listIterator.remove();//remove element at 3rd position 
listIterator.next(); 
listIterator.next(); 
listIterator.remove();//remove element at 5th position 
2

嘗試這種方式,

ArrayList<String> List_Of_Array = new ArrayList<String>(); 
List_Of_Array.add("A"); 
List_Of_Array.add("B"); 
List_Of_Array.add("C"); 
List_Of_Array.add("D"); 
List_Of_Array.add("E"); 
List_Of_Array.add("F"); 
List_Of_Array.add("G"); 
List_Of_Array.add("H"); 

int i[] = {5,3,1}; 

for (int j = 0; j < i.length; j++) { 
    List_Of_Array.remove(i[j]); 
} 
10
public void DeleteUserIMP(UserIMP useriamp) { 
     synchronized (ListUserIMP) { 
      if (ListUserIMP.isEmpty()) { 
      System.out.println("user is empty"); 
     } else { 
      Iterator<UserIMP> it = ListUserIMP.iterator(); 
      while (it.hasNext()) { 
       UserIMP user = it.next(); 
       if (useriamp.getMoblieNumber().equals(user.getMoblieNumber())) { 
        it.remove(); 
        System.out.println("remove it"); 
       } 
      } 
      // ListUserIMP.remove(useriamp); 

      System.out.println(" this user removed"); 
     } 
     Constants.RESULT_FOR_REGISTRATION = Constants.MESSAGE_OK; 
     // System.out.println("This user Deleted " + Constants.MESSAGE_OK); 

    } 
} 
1

如果使用「=」,則會爲第二個數組中的原始數組列表創建副本,但引用相同,因此如果您在一個列表中更改,另一個列表也會被修改。使用此,而不是「=」

 List_Of_Array1.addAll(List_Of_Array); 
5

如前

iterator.remove() 

提的是,也許在循環過程中刪除列表項的唯一安全的方法。

對於使用迭代器項目去除更深層次的理解,嘗試看看這個thread

+0

我發愣沒票了,我完全同意你的意見。這是最安全的方式。 – Simmant

2

刪除(INT指數)的ArrayList方法刪除在列表中的指定位置(指數)的元素。刪除數組列表後,將任何後續元素移到左側。

意味着如果一個ArrayList包含{20,15,30,40}

我已經調用的方法:arraylist.remove(1)

然後將數據15將被刪除,30 & 40這些兩項將左移1。

因此,您必須先刪除較高的數組列表索引項。

因此,對於您給定的情況..代碼將..

ArrayList<String> list = new ArrayList<String>(); 
list.add("A"); 
list.add("B"); 
list.add("C"); 
list.add("D"); 
list.add("E"); 
list.add("F"); 
list.add("G"); 
list.add("H"); 

int i[] = {1,3,5}; 

for (int j = i.length-1; j >= 0; j--) { 
    list.remove(i[j]); 
} 
2

我想我是升序排序的數組,這裏是迭代另一種解決方案,它是更通用:

ArrayList<String> list = new ArrayList<String>(); 
list.add("A"); 
list.add("B"); 
list.add("C"); 
list.add("D"); 
list.add("E"); 
list.add("F"); 
list.add("G"); 
list.add("H"); 

int i[] = {1,3,5}; 

Iterator<String> itr = list.iterator(); 
int pos = 0; 
int index = 0; 
while(itr.hasNext()){ 
    itr.next(); 
    if(pos >= i.length){ 
     break; 
    } 
    if(i[pos] == index){ 
     itr.remove(); 
     pos++; 
    } 

    index++; 
}