Java 如何从ArrayList中删除元素?

Java 如何从ArrayList中删除元素?,java,arraylist,Java,Arraylist,我已经在ArrayList中添加了数据,现在我想更新该列表,从中删除一些元素 我在carentry类型的ArrayList中有类似于1,2,3,4的元素 代码: ArrayList<CartEntry> items = new ArrayList<CartEntry>(); public void remove(int pId) { System.out.println(items.size()); for(CartEntry ce : items)

我已经在
ArrayList
中添加了数据,现在我想更新该列表,从中删除一些元素

我在
carentry
类型的
ArrayList
中有类似于1,2,3,4的元素

代码:

ArrayList<CartEntry> items = new ArrayList<CartEntry>();

public void remove(int pId)
{
    System.out.println(items.size());

    for(CartEntry ce : items)
    {
        if(ce.getpId() == pId)
        {
            items.remove(ce);
            //System.out.println(items.get(1));             
        }
    }   
    items.add(new CartEntry(pId));
}
建造商:

public CartEntry(long pId) {
    super();
    this.pId = pId;     
}
当我尝试此代码时,它会给我一个错误:

java.util.ConcurrentModificationException
    at java.util.ArrayList$Itr.checkForComodification(Unknown Source)
    at java.util.ArrayList$Itr.next(Unknown Source)
这里是一个参数,指定应从项中删除该项。
假设我要删除包含2个数据的项,那么我必须做什么?

在Carentry中实现.equals,然后使用ArrayList.remove(Carentry)或循环遍历数组列表,找到具有某些条件的项,标记索引,并调用ArrayList.remove(index)——循环之后,代码至少有两个问题:

  • 对迭代的集合调用
    remove
    ,如果在
    remove
    之后继续迭代,则会导致错误

    有两种方法可以解决此问题:

    • 找到要删除的对象后停止迭代(只需添加
      中断
      返回
      )或
    • 从增强的for循环切换到使用and
  • remove
    方法中添加一个元素,这可能不是您想要的

  • 所以我会使用这个代码(假设列表中只有一个
    CartEntry
    具有给定id):

    如果具有唯一id的假设不正确,则需要使用
    迭代器
    方法:

    public void remove(int pId)
    {
        Iterator<CartEntry> it = items.iterator();
        while(it.hasNext())
        {
            CartEntry ce = it.next();
            if(ce.getpId() == pId)
            {
                it.remove();
            }
        }   
    }
    
    public void remove(int-pId)
    {
    Iterator it=items.Iterator();
    while(it.hasNext())
    {
    CartEntry ce=it.next();
    if(ce.getpId()==pId)
    {
    it.remove();
    }
    }   
    }
    
    您面临的是
    ConcurrentModificationException
    ,因为您一次在同一
    列表上执行两个操作。i、 e同时循环和移除

    为了避免这种情况,请使用迭代器,它可以保证安全地从列表中删除元素

    一个简单的例子如下

    Iterator<CartEntry> it = list.iterator();
        while (it.hasNext()) {
            if (it.next().getpId() == pId) {
                it.remove();
                break;
            }
        }
    
    Iterator it=list.Iterator();
    while(it.hasNext()){
    if(it.next().getpId()==pId){
    it.remove();
    打破
    }
    }
    
    试试看

    public void remove(int-pId){
    Iterator it=items.Iterator();
    while(it.hasNext()){
    carentry entry=it.next();
    if(entry.getpId()==pId){
    it.remove();
    }
    }
    }
    
    用于迭代
    表达式的
    增强的
    循环,该表达式是
    Iterable
    或原始
    Iterable
    的子类型,基本上等同于以下形式:

      for (I #i = Expression.iterator(); #i.hasNext(); ) {   
          VariableIdentifiers_opt TargetType Identifier = (TargetType) #i.next();
             Statement
       }
    
    这一点在第节中有明确说明

    对于您的上下文,
    表达式是一个
    数组列表
    ArrayList
    的迭代器方法返回的迭代器是快速失败的:如果在创建迭代器后的任何时候,以迭代器自己的remove或add方法以外的任何方式对列表进行结构修改,迭代器将抛出
    ConcurrentModificationException

    改用
    迭代器
    并使用它自己的
    remove()
    方法:

      Iterator<E>iterator = list.iterator();
      while(iterator.hasNext())
        if(iterator.next().equals(E))
          iterator.remove();
    
    iteratoriator=list.iterator();
    while(iterator.hasNext())
    if(iterator.next().equals(E))
    iterator.remove();
    
    您已经创建了类型为
    carEntry
    的Arraylist。因此,您需要创建类型为
    CarEntry

    Iterator<CarEntry> it =  items.iterator();    
    while(it.hasNext())
    {
       if(it.next().getPId == PId)
       it.remove();
    }
    
    Iterator it=items.Iterator();
    while(it.hasNext())
    {
    if(it.next().getPId==PId)
    it.remove();
    }
    
    您的代码出了什么问题?在没有迭代器的情况下不要删除。这很危险。@marounnaroun-Sir我已经发布了我得到的异常以及如何实现迭代器?为什么要在删除函数中再次添加carentry“items.add(new carentry(pId));”,只需按与之相反的顺序迭代列表即可(int i=items.count;i极好的答案..每个人的答案都是一样的,你的一行额外代码使我的代码变得简单可行,这是一个简单的
    中断
    .Thanx.@user2659972ღ: 中断是不必要的,只有当您知道没有两个
    carentry
    对象具有相同的id时才真正有用。@JoachimSauer-是的,先生,但是如果我不使用
    break
    和delete item,那么它就工作了,但在那之后,我得到了与上面相同的错误,但问题项被删除了。这就是为什么
    break
    帮我完成它。@user2659972ღ: 如果您得到的异常没有
    中断
    ,那么您仍然在使用
    项。remove()
    ,而不是
    项。remove()
      for (I #i = Expression.iterator(); #i.hasNext(); ) {   
          VariableIdentifiers_opt TargetType Identifier = (TargetType) #i.next();
             Statement
       }
    
      Iterator<E>iterator = list.iterator();
      while(iterator.hasNext())
        if(iterator.next().equals(E))
          iterator.remove();
    
    Iterator<CarEntry> it =  items.iterator();    
    while(it.hasNext())
    {
       if(it.next().getPId == PId)
       it.remove();
    }