Можно вот так попробовать.
В первом hashmap можно хранить пару mail-user, во втором hashmap пару user - user.
Пример:
u1-m1, m2
u2-m3, m2
u3-m4
u5-m4, m5, m1
Идём по списку, обрабатывает пару u1-m1.
m1-u1 -> heshmap1
Дальше аналогично для второй пары:
m2-u1 -> heshmap1
Для следующей пары:
m3-u2 -> heshmap1
Следующая пара, тут важный момент, т.к. ключ
m2 уже есть в heshmap1, то не нужно туда ничего писать, а нужно добавить в
heshmap2 для ключа u2 значение u1, потому что в heshmap1 значение для ключа m2 есть u1.
Т.е. имеем u2-u1 -> heshmap2
Далее
m4-u3 -> heshmap1
Затем, т.к. ключ m4 уже есть в heshmap1 снова идём в heshmap2:
u5-u3 -> heshmap2
Далее
m5-u5-> heshmap1
И последний шаг u5 - m1, тут нюанс, в heshmap1
уже есть ключ m1 значит идём в heshmap2, но там тоже уже есть ключ u5, значит нужно уже имеющуюся в heshmap2 пару u5-u3 удалить и вместо неё добавить две новые:
u3-u1-> hashmap2
u5-u1-> hashmap2
Значение u1 берём из hashmap1[m1]
В итоге имеем:
heshmap1
m1-u1
m2-u1
m3-u2
m4-u3
m5-u5
heshmap2
u2-u1
u3-u1
u5-u1
Далее идём по ключам heshmap1(это email) и определяем для каждого из них значение из heshmap2 (это пользователи).
mail = heshmap1[heshmap1.key[i]]
user = heshmap2[heshmap1[mail]]
Если в heshmap2 нет какого-то значения, значит берём юзера из heshmap1.key[i]
В итоге соединив два heshmap получим такой список:
u1-m1
u1-m2
u1-m3
u1-m4
u1-m5
Т.е. все email принадлежат одному юзеру.