2012-05-23 143 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++; 
}