【问题标题】:How to remove items from generic arraylist in Android (Java)如何从 Android (Java) 中的通用数组列表中删除项目
【发布时间】:2012-07-11 08:59:57
【问题描述】:

我在这里有一个对象的通用数组列表我想删除某些元素,问题是当我用 for 循环迭代列表时,我不能做一个简单的remove() 序列,因为元素被移动了每次删除后。

谢谢

【问题讨论】:

  • 您是否有要删除的特定值可用?
  • 是的,在对象中我有一个布尔值,我必须检查并删除该项目

标签: java android


【解决方案1】:

使用Iterator 删除元素

喜欢

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

【讨论】:

  • 将您的链接更改为指向 Android 迭代器。在它指向以前的 Java 版本之前。如果您愿意,请随时恢复它。
  • 如果我必须删除列表中的第 2 项和第 4 项,就会出现问题。由于第二项被删除,所以会有一个转变
  • @Rakshi:如果您知道要删除哪些元素,则可以不使用 for 循环。
  • 如果我的列表中有 5 项,我必须删除第 2 项和第 5 项,如果我先删除第 2 项,那么列表将只有 4 项,当我尝试删除第 5 个
  • 使用迭代器,您可以始终处理要订购的元素,而不是指定的索引。所以,你不应该为上面的事情而烦恼。
【解决方案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);

对比

kopeks.remove(i);

要实现位置移除,通过适当处理移动目标...

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++;
  }
}

【讨论】:

  • 感谢您的努力.. 但解决方案 list.remove(object);即使没有帮助它创建相同的异常.. 它更好地使用迭代器或检查解决方案而不使用下面的迭代器
【解决方案3】:

如果您有想要从ArrayList&lt;T&gt; 中删除的对象,您可以使用:

mArrayList.remove(object);

或者您可以使用Iterator 删除您的对象:

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

【讨论】:

  • 问题是当我删除列表中的任何项目时,都会发生变化并产生异常
【解决方案4】:

您可以迭代 向后 并在遍历 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();
        }
    }

【讨论】:

    【解决方案5】:

    为要从原始 ArrayList 中删除的数据创建一个单独的 ArrayList,然后通过使用 for 循环对其进行循环来删除这些元素。

    ArrayList<Myobj> arr = new ArrayList<Myobj>();
    
    for (Myobj o : arr){
    
      arr.remove(arr.indexOf(o));
    
     }
    

    【讨论】:

    • 问题是当我删除列表中的任何项目时,都会发生变化并产生异常
    • 你实际上想要做什么,你想要从ArrayList中移除的数据中的数据,或者想要移除数据后新形成的ArrayList的索引。
    • 我需要从列表中删除随机对象。就像如果列表中有 5 个项目我想删除第二个和第四个对象.. 你可以在下面找到解决方案。感谢您的关注
    【解决方案6】:

    不使用迭代器也解决了这个问题。我想要做的就是获取要删除的索引并按降序对其进行排序,然后将其从列表中删除。 检查下面的代码

    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);
    

    【讨论】:

      猜你喜欢
      • 2017-02-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-06-21
      • 2014-12-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多