【问题标题】:concurrent modification exception while iterating list map string object and edit key迭代列表映射字符串对象和编辑键时并发修改异常
【发布时间】:2020-05-03 10:35:13
【问题描述】:

我将查询结果与列名一起放入List<Map<String, Object>>。有时列名类似于TableAlias.ColumnName,在这种情况下,我想将其更改为ColumnName 并删除TableAlias.,因为我有以下代码:

queryResult = namedParameterJdbcTemplateHive.queryForList(query, paramSource);

for (Map<String, Object> map : queryResult) {
    for (Map.Entry<String, Object> entry : map.entrySet()) {            
        String[] keyData = entry.getKey().split("\\.");
        if (keyData.length > 0) {
            Object obj = map.remove(entry.getKey());
            map.put(keyData[1], obj);
        }                   
    }
}

这给了我concurrent modification exception,所以我尝试使用如下迭代器:

for (Map<String, Object> map : queryResult) {
    for(Iterator<Map.Entry<String, Object>> it = map.entrySet().iterator(); it.hasNext(); ) {
        Map.Entry<String, Object> entry = it.next();
        String[] keyData = entry.getKey().split("\\.");
        if (keyData.length > 0) {
            it.remove();                        
        }
    }
}

但不确定如何使用新密钥重新添加项目。

有什么建议吗?

【问题讨论】:

  • 只是一个旁注:如果您要删除表别名,您可能会发生冲突!想象一下tablename.idtablename2.id 的情况。如果您删除表名,您将用另一个 id 值覆盖一个 id 值,而最终不会意识到这一点。高度危险的恕我直言
  • 或者简而言之:将结果放入新地图中。然后,您可以跳过从旧地图中删除密钥,然后继续使用新地图。

标签: java collections hashmap iterator concurrentmodification


【解决方案1】:

我会遍历原始地图并用更新后的键填充另一个地图。

queryResult = namedParameterJdbcTemplateHive.queryForList(query, paramSource);

Map<String, Object> newMap = new HashMap<>();
for (Map.Entry<String, Object> entry : map.entrySet()) {
   String[] keyData = entry.getKey().split("\\.");
   if (keyData.length > 1) {
       newMap.put(keyData[1], entry.getValue());
   } else {
       newMap.put(entry.getKey(), entry.getValue());
   }
}

【讨论】:

  • 我刚刚看到您有一个地图列表,您可能需要稍后通过将 newMap 添加到新列表来适应...
  • 您对上面的评论绝对正确,我没有考虑在不同的表中具有相同的字段名称。感谢您的回复,但我会保留别名:)
  • 奇怪的是keyData.length &gt; 0条件,后面是访问keyData[1]。条件永远不会是false,因为拆分字符串不能产生零元素,但是当没有点时,操作会产生异常……
  • 或者,for(Map.Entry&lt;String, Object&gt; entry: map.entrySet()) { newMap.put(entry.getKey().replaceFirst("(?s).*?\\.([^.]*).*", "$1"), entry.getValue()); }...
  • 我遇到了问题。有人告诉我使用正则表达式。现在我有两个问题......
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2011-01-16
  • 2014-04-13
  • 1970-01-01
  • 2010-10-15
  • 1970-01-01
  • 2015-09-03
  • 2014-09-20
相关资源
最近更新 更多