首页 > 解决方案 > 从地图中删除所有不匹配的元素会导致 java.util.ConcurrentModificationException

问题描述

我写了以下代码:

for (Character currentChar : userDocuments.keySet()) {
    List<QueryDocumentSnapshot> currentList = userDocuments.get(currentChar);
    if (currentList == null) {
        userDocuments.remove(currentChar);
        continue;
    }
    for (int index = 0; index < currentList.size(); ++index) {
        final String currentFullName = currentList.get(index).getString("full_name");
        if (currentFullName == null || !(searchText.contains(currentFullName))) {
            currentList.remove(index);
        }
    }
    if (currentList.size() == 0) {
        userDocuments.remove(currentChar);
    }
}

我想遍历地图Map<Character,List<QueryDocumentSnapshot>>检查 full_name (每个字段QueryDocumentSnapshot)是否包含searchText,如果不是,则从列表中删除此元素。如果列表为空,则删除整个列表。但由于某种原因,我java.util.ConcurrentModificationException上了第一线。另外,如何在contains不区分大小写的情况下使用?

标签: java

解决方案


ConcurrentModificationException在不允许同时修改对象时发生。当使用 Java Collection 类时,通常会出现此异常。例如 - 当某个其他线程正在对其进行迭代时,不允许线程修改 Collection。

在您的情况下,这是因为您在迭代它们时尝试从 Map 和 ArrayList 中删除一些元素

您可以使用以下方法避免它:

    Iterator<Map.Entry<Character, List<QueryDocumentSnapshot>>> mapIterator = userDocuments.entrySet().iterator();
    while (mapIterator.hasNext())
    {
      Map.Entry<Character,List<QueryDocumentSnapshot>> entry = mapIterator.next();
      List<QueryDocumentSnapshot> currentList = entry.getValue();
      if (currentList == null) {
         mapIterator.remove();
         continue;
      }
      Iterator<QueryDocumentSnapshot> listIterator = currentList.iterator();

      while (listIterator.hasNext()) {
          final String currentFullName = listIterator.next().getString("full_name");
          if (currentFullName == null || !(searchText.contains(currentFullName))){
             listIterator.remove();
           }
      }
      if (currentList.size() == 0) {
        mapIterator.remove();
      }
    }   

要回答您的问题“我如何使用不区分大小写的包含”,您可以简单地使用以下内容:

searchText.toLowerCase().contains(currentFullName.toLowerCase())

推荐阅读