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