исключение одновременной модификации при итерации строкового объекта карты списка и ключа редактирования - PullRequest
0 голосов
/ 16 января 2020

Я добавляю 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();                        
        }
    }
}

Но не уверен, как добавить элемент обратно с новым ключом.

Есть предложения, пожалуйста?

1 Ответ

2 голосов
/ 16 января 2020

Я бы перебрал исходную карту и заполнил другую карту обновленными ключами.

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());
   }
}
...