Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/fsharp/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
使用list.remove()时的Java ConcurrentModificationException_Java_Arraylist_Iterator - Fatal编程技术网

使用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;
    }