使用list.remove()时的Java ConcurrentModificationException
我有一个名为使用list.remove()时的Java ConcurrentModificationException,java,arraylist,iterator,Java,Arraylist,Iterator,我有一个名为removeSup的方法,它应该从补遗列表中删除一个对象Supplement。 这是该方法的代码: private static void removeSup(Supplement supToRemove, List<Supplement> listToRemoveFrom) { Iterator<Supplement> iterator = listToRemoveFrom.iterator(); while(itera
removeSup
的方法,它应该从补遗列表中删除一个对象Supplement
。
这是该方法的代码:
private static void removeSup(Supplement supToRemove, List<Supplement> listToRemoveFrom) {
Iterator<Supplement> iterator = listToRemoveFrom.iterator();
while(iterator.hasNext()){
if(iterator.next().equals(supToRemove)){
iterator.remove();
}
}
}
类补遗具有以下构造函数
public Supplement(String _name, Double _price, String _magName ){
this.name=_name;
this.price=_price;
this.magName = _magName;
}
在主类client
中,用户可以进行搜索以删除某个补充
private static void searchSup(){
System.out.println("Search for Supplement");
String search = scanner.nextLine();
for (Supplement sup : magazine.getSupList()) {
if (!sup.getSupName().equalsIgnoreCase(search)) {
//do something
}
else{
removeSup(sup,magazine.getSupList());
}
}
}
客户端类中的主要方法如下所示:
private Magazine magazine;
public static void main(String[] args) {
magazine = new Magazine(3.0, "pop");
List<Supplement> startList = new ArrayList<>();
startList.add(new Supplement("Nat Geo", 3.0,"pop"));
startList.add(new Supplement("Discovery", 5.0,"pop"));
startList.add(new Supplement("Health", 6.3,"pop"));
startList.add(new Supplement("IT", 8.3,"pop"));
magazine.setSupList(startList);
searchSup();
}
是我用来搜索的for循环给了我一个错误吗?如果是这样的话,我该如何解决这个问题呢?您通常不应该在迭代过程中修改集合。可以修改元素,但在迭代时确实不应该从集合中删除某些内容。请参见此处:。另外,ConcurrentModificationException
的Javadoc可能会有所帮助
您可以尝试返回一个新的列表,并删除补充内容
:
private static List<Supplement> removeSup(Supplement supToRemove, List<Supplement> listToRemoveFrom) {
List<Supplement> filteredSupplements = new ArrayList<Supplement>();
for(Supplement supplement : listToRemoveFrom) {
if(!suppplement.equals(supToRemove)){
filteredSupplements.add(supplement);
}
}
return filteredSupplements;
}
private static List removeSup(补充supToRemove,List listtoremovesfrom){
List filteredSupplements=new ArrayList();
对于(补充:列表删除自){
如果(!supplement.equals(supToRemove)){
过滤补充。添加(补充);
}
}
返回过滤器补充;
}
在main方法中,“杂志”是本地变量,searchSup无法访问。请像
私人void searchSup(杂志)
{
//...
}
如果您能提供更多详细信息,那么第131行和第140行中的代码将非常有用。我发现我所做的搜索与我想要做的不符,因此我创建了一个方法,该方法返回列表中补充内容的整数
private static int indexOfSup(List<Supplement> supSearchList, String nameOfSup) {
for (Supplement sup : supSearchList) {
if (sup.getSupName().equalsIgnoreCase(nameOfSup)) {
return supSearchList.indexOf(sup);
}
}
return -1;
}
private static int indexOfSup(List supSearchList,String nameOfSup){
用于(补充辅助:辅助搜索列表){
if(sup.getSupName().equalsIgnoreCase(nameOfSup)){
返回supSearchList.indexOf(sup);
}
}
返回-1;
}
然后我使用这个整数从列表中删除。
一个简单的列表。删除(索引)
效果很好
感谢您的回复。您是否阅读了有关ConcurrentModificationException的javadoc?另外,您是否搜索过类似的问题?与其使用新的迭代器在removeSup
中再次遍历列表,在searchSup
中使用显式迭代器进行迭代,并在searchSup
中使用该迭代器的remove
。可能重复的@user2357112具有最佳答案IMO@user2357112我试着这么做,却得到了同样的错误`还有像这样的{magage.getSupList().remove(sup);}吗?谢谢。有什么方法可以从列表中删除元素吗?Collection
接口有一个remove()
方法,但是您需要为实现它的每个集合阅读Javadoc。您确实在做Java可以为您做的大量工作。查找集合
和列表
接口,特别是它们的remove()
方法以及如何覆盖对象的equals()
。
private static List<Supplement> removeSup(Supplement supToRemove, List<Supplement> listToRemoveFrom) {
List<Supplement> filteredSupplements = new ArrayList<Supplement>();
for(Supplement supplement : listToRemoveFrom) {
if(!suppplement.equals(supToRemove)){
filteredSupplements.add(supplement);
}
}
return filteredSupplements;
}
private static int indexOfSup(List<Supplement> supSearchList, String nameOfSup) {
for (Supplement sup : supSearchList) {
if (sup.getSupName().equalsIgnoreCase(nameOfSup)) {
return supSearchList.indexOf(sup);
}
}
return -1;
}