Речь идет о Java, но для удобства чтения я собираюсь записать примеры в JSON.Как объединить несколько карт по значению определенного ключа?
Скажем, у меня есть List
из Map
, настроил так:
[{
"id": 1,
"foo": 12,
"bar": 34
}, {
"id": 1,
"baz": 56
}, {
"id": 2,
"foo": 78
}, {
"id": 2,
"bar": 90
}]
То, что я хотел бы сделать, это объединить карты, которые имеют тот же id
. В принципе, я хочу, чтобы в конечном итоге с чем-то вроде этого:
[{
"id": 1,
"foo": 12,
"bar": 34,
"baz": 56
}, {
"id": 2,
"foo": 78,
"bar": 90
}]
Все другие вопросы я нашел дело с объединением карт в несвязанных способами, и большинство из них только о двух картах, а не переменной суммы.
Этого код, кажется, работает, но меня поражает, как мало подробный вывод:
List<Map<String, Integer>> toRemove = new ArrayList<Map<String, Integer>>();
for (Map<String, Integer> map : list) {
if (toRemove.contains(map)) {
continue;
}
int id = map.get("id");
for (Map<String, Integer> otherMap : list) {
if (map.equals(otherMap)) {
continue;
}
int otherId = otherMap.get("id");
if (id == otherId) {
map.putAll(otherMap);
toRemove.add(otherMap);
}
}
}
list.removeAll(toRemove);
Есть ли более элегантный способ для достижения этой цели?
в вашем примере нет ни одного случая, в котором карты с той же долей ид ключа (в данном случае значения должны быть SUMED я думаю). Это гарантировано? – fustaki
Это будет O (n * n) и медленное для большого набора данных. Один из подходов состоит в том, что вы можете сортировать список на основе id и объединиться, пока не получите тот же идентификатор. – theBeacon
@fustaki Я могу предположить, что они не разделяют ключи, кроме «id», и если бы они это сделали, все было бы хорошо просто заменить любой из них. – vvye