Java 在映射中添加项目时的ConcurentModificationException
在将项添加到与键对应的现有列表时,我面临java.util.ConcurrentModificationException 这是我的密码Java 在映射中添加项目时的ConcurentModificationException,java,java-8,Java,Java 8,在将项添加到与键对应的现有列表时,我面临java.util.ConcurrentModificationException 这是我的密码 final Map<String, List<Apple>> feedToApplesMap = new HashMap<>(); for (final Apple Apple : AppleList) { final List<String> feedDocumentIds = Apple.getFee
final Map<String, List<Apple>> feedToApplesMap = new HashMap<>();
for (final Apple Apple : AppleList) {
final List<String> feedDocumentIds = Apple.getFeedDocumentIds();
for (final String feedId : feedDocumentIds) {
final List<Apple> AppleListForFeed = feedToApplesMap
.getOrDefault(feedId, new ArrayList<>());
AppleList.add(Apple);
feedToApplesMap.put(feedId, AppleListForFeed);
}
}
final Map feedToApplesMap=new HashMap();
用于(最终苹果:苹果列表){
最终列表FeedDocumentId=Apple.getFeedDocumentId();
用于(最终字符串feedId:feedDocumentID){
最终列表AppleListForFeed=feedToApplesMap
.getOrDefault(feedId,new ArrayList());
AppleList.add(苹果);
feedToApplesMap.put(feedId,AppleListForFeed);
}
}
我无法使用迭代器来解决这个问题?有什么建议吗?看来你把苹果放错地方了。难道不是吗
AppleListForFeed.add(Apple)
而不是AppleList.add(Apple)
?看起来你把苹果放错地方了。难道不是吗
AppleListForFeed.add(Apple)
而不是AppleList.add(Apple)
?我同意@andbi的观点,这个问题是由于打字错误造成的。但是作为一个例外,这样做for(final Apple:AppleList)
您仍然在无意中使用迭代器,这就是为什么这里AppleList.add(Apple)
将抛出ConcurrentModificationException,您可以这样做以避免使用迭代器:
final Map<String, List<Apple>> feedToApplesMap = new HashMap<>();
int size = AppleList.size();
for (int i = 0; i < size; i++) {
final Apple Apple = AppList.get(i);
final List<String> feedDocumentIds = Apple.getFeedDocumentIds();
for (final String feedId : feedDocumentIds) {
final List<Apple> AppleListForFeed = feedToApplesMap
.getOrDefault(feedId, new ArrayList<>());
AppleList.add(Apple);
feedToApplesMap.put(feedId, AppleListForFeed);
}
}
final Map我同意@andbi的观点,这个问题是由于打字错误造成的。但是作为一个例外,这样做for(final Apple:AppleList)
您仍然在无意中使用迭代器,这就是为什么这里AppleList.add(Apple)
将抛出ConcurrentModificationException,您可以这样做以避免使用迭代器:
final Map<String, List<Apple>> feedToApplesMap = new HashMap<>();
int size = AppleList.size();
for (int i = 0; i < size; i++) {
final Apple Apple = AppList.get(i);
final List<String> feedDocumentIds = Apple.getFeedDocumentIds();
for (final String feedId : feedDocumentIds) {
final List<Apple> AppleListForFeed = feedToApplesMap
.getOrDefault(feedId, new ArrayList<>());
AppleList.add(Apple);
feedToApplesMap.put(feedId, AppleListForFeed);
}
}
final Map当我们使用for循环或for each迭代列表时,会发生这种情况,在迭代过程中会在列表之间添加一些元素,因此请使用迭代器或迭代列表:
val iterator = yourList.iterator()
while (iterator.hasNext()) {
val currentItem = iterator.next()
}
现在,在迭代过程中添加或删除列表中的任何其他元素。当我们使用for循环或for each迭代列表时,会发生这种情况,并且在迭代过程中会在列表之间添加一些元素,因此请使用迭代器或迭代列表:
val iterator = yourList.iterator()
while (iterator.hasNext()) {
val currentItem = iterator.next()
}
现在,在迭代过程中添加或删除列表中的任何其他元素。为什么要执行AppleList.add(Apple)代码>?请编辑您的问题以包含异常的完整堆栈跟踪。更适合Java 8的方法是使用流
和groupingBy()
。通过这样做,您可能会摆脱所有嵌套循环,并限制出现错误的可能性(例如add()
到代码中的错误列表中)。遵守命名约定。这段代码真的很难阅读。显然,您想要添加到AppleListForFeed
,而不是AppleList
。在这种情况下,将整个循环体简化为feedToApplesMap.computeIfAbsent(feedId,key->newarraylist()).add(Apple)
,因此您不需要另一个put
操作。为什么要执行AppleList.add(Apple)代码>?请编辑您的问题以包含异常的完整堆栈跟踪。更适合Java 8的方法是使用流
和groupingBy()
。通过这样做,您可能会摆脱所有嵌套循环,并限制出现错误的可能性(例如add()
到代码中的错误列表中)。遵守命名约定。这段代码真的很难阅读。显然,您想要添加到AppleListForFeed
,而不是AppleList
。在这种情况下,将整个循环体简化为feedToApplesMap.computeIfAbsent(feedId,key->newarraylist()).add(Apple)
,因此不需要另一个put
操作。