我有一个名字,电话号码和位置的arraylist。
如果可能,我想从该数组中删除某些项目
一旦我发现它,就像我在下面试过的那样,是否有移除物品?
public void delete(String nameToDelete)
{
for (Entry entry : Directory.entries) {
if (entry.name.equalsIgnoreCase(nameToDelete))
{
//remove(entry);
}
}
}
由于
答案 0 :(得分:2)
ArrayList返回的迭代器性质为fail-fast
。
此类的迭代器和
listIterator
方法返回的迭代器是fail-fas
t:如果在创建迭代器之后的任何时候对列表进行结构修改,除非通过迭代器自己的删除或添加方法,迭代器将抛出ConcurrentModificationException
。因此,面对并发修改,迭代器会快速而干净地失败,而不是在未来不确定的时间冒着任意的,非确定性行为的风险。
对于集合的增强for循环Iterator
被使用,因此在迭代时不能调用remove方法。
所以你的循环与下面相同
for (Iterator<Entry> i = c.iterator(); i.hasNext(); ){
您可以调用iterator.remove();
并基于迭代器显式而不是隐式更改循环。
String inputWord = "john";
ArrayList<String> wordlist = new ArrayList<String>();
wordlist.add("rambo");
wordlist.add("john");
for (ListIterator<String> iterator = wordlist.listIterator(); iterator
.hasNext();) {
String z = iterator.next();
if (z.equals(inputWord)) {
iterator.remove();
}
}
System.out.println(wordlist.size());
答案 1 :(得分:1)
您应该使用Iterator
从列表中删除条目。如果你尝试修改你的List
,同时通过增强的for循环迭代它,它可能会抛出ConcurrentModificationException,虽然这不会总是发生,但是不能保证。
以下是将Iterator
用于列表的方法: -
Iterator<Entry> iterator = Directory.entries.iterator();
while (iterator.hasNext()) {
Entry entry = iterator.next();
if (entry.name.equalsIgnoreCase(nameToDelete)) {
iterator.remove();
}
}
即使在Iterator
中,您也应该使用iterator.remove
方法而不是list.remove
方法删除元素,因为这不会产生任何影响。
您还可以使用ListIterator,它为您提供了更多操作和方法来迭代列表。有关详细信息,请参阅文档。
要使用ListIterator
,您可以像这样创建: -
ListIterator<Entry> listIterator = Directory.entries.listIterator();
其余代码的工作原理相同。
答案 2 :(得分:0)
您要做的是使用if entry.getKey().equals(nameToDelete)
检查它是否是您想要的那个,然后使用remove()
方法删除该条目。
但是,你不能在for()
循环内部迭代你正在修改的同一个集合。您将获得ConcurrentModificationException。
请参阅"How to Avoid ConcurrentModificationException when using an Iterator"。