2012-07-11 173 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);