Предположим, у меня есть такая мультикарта:
MiddleName -> null
EmailAddress -> [email protected], [email protected], [email protected]
FirstName -> Toni, Mary, Paul
LastName -> Barry, null ,White
Id -> null
Обратите внимание, что каждая запись «значения» может быть полностью пустой или содержать то же количество значений, что и запись с большим количеством записей (я не знаю, какая именно), даже если некоторые из них равны нулю.
Я хочу, чтобы он «переносил» его в список карт, например:
MiddleName -> null
EmailAddress -> [email protected]
FirstName -> Toni
LastName -> Barry
Id -> null
MiddleName -> null
EmailAddress -> Mary@hermail
FirstName -> John
LastName -> null
Id -> null
MiddleName -> null
EmailAddress -> [email protected]
FirstName -> Paul
LastName -> White
Id -> null
Я пытаюсь сделать это с потоками java8, но могу сделать это и в «старом» стиле.
При поиске в stackoverflow я нашел аналогичный вопрос [1] и еще несколько, также связанных [2,3,4], которые дали мне некоторые идеи, но не были полностью адаптированы.
Теперь я реализовал свое собственное решение, которое работает так, как я хочу, но, честно говоря, это, вероятно, самый уродливый код, который я написал за последние годы...
List result = (...)
map.forEach(h -> {
MultiValueMap<String, String> m = new LinkedMultiValueMap();
h.entrySet().stream().forEach(e -> {
String[] ss = e.getValue() == null ? null : e.getValue().toString().split(",");
if (ss != null) {
Arrays.asList(ss).stream().forEach(s -> m.add(e.getKey(), s));
}
});
if (m.size() > 0) {
int x = m.values().stream().max((o1, o2) -> o1.size() - o2.size()).get().size();
for (int i = 0; i < x; i++) {
Map<String, String> n = (Map) h.clone();
Iterator<Map.Entry<String, String>> it = n.entrySet().iterator();
while( it.hasNext()){
Map.Entry<String, String> e = it.next();
List<String> ss = m.get(e.getKey());
if(ss!=null) {
e.setValue(ss.get(i));
}
}
result.add(n);
}
}
});
Первый проход - просто разбить строку на массив, поскольку изначально это строка, разделенная запятыми. Затем я нахожу максимальное количество элементов в любом значении, зацикливаю все значения в записях столько раз и создаю карту для каждого значения с результатами. Честно говоря, я написал этот код в прошлую пятницу и уже не могу его правильно прочитать...
Итак, сначала это было просто, и я закончил с этим беспорядком, есть ли лучший способ сделать это?
Заранее спасибо.
[1] Потоки Java8: карта транспонирования со значениями в виде списка
[2] изменение ключей/значений - создать новый экземпляр HashMap
[3] Транспонировать хэш-карту для ключа-›значение в значение- ›ключ?