java - 从地图中删除所有不匹配的元素会导致 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
不区分大小写的情况下使用?
解决方案
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())
推荐阅读
- c# - C# 表单类扩展问题
- ocaml - LSP 服务器示例
- ios - 即使启用了设备“请勿打扰”,如何显示 VoIP 推送呼叫的传入 CallKit 窗口?
- onnx - caffe2 推断 onnx 模型,发生 IndexError: Input 475 is undefined
- java - 在Java中减少扩展数量以尽可能减少类的最佳方法是什么?
- c++ - QtQuick - QQuickItem mouseMoveEvent 不工作
- powershell - 加入域后设置自动登录到本地用户
- java - 具有唯一元素的 Java 线程安全并发队列
- android - React-native:允许在 Android 中使用音频的权限
- c++ - 在 connect() 调用中看不到我的服务器名称的 arduino 变量