Колупаюсь с этой задачей уже большое количество времени. Сегодня осенило, что я вызывал на итерацию в removeTheFirstNameDuplicates основной список map, передавал из него значения в removeItemFromMapByValue где по идее из map удалялось значение, что нельзя сделать без итератора. (а как он работает с map я до сих пор не врублюсь), в связи с чем, было решено делать ещё копию основного списка map. Пояснения по коду. Делаю ещё одну копию основного списка на итерацию пойдёт он. (Копирование map в copy2 происходит через for, потому что, Ителледж почему-то на putAll ругается). На итерацию идёт copy2. Из него надо получить значение y которое потом передаётся в метод removeItemFromMapByValue где есть ещё одна копия map под названием copy (где Ителледж на putAll не ругается), которая впоследствии вызывается на итерацию, сравнивается с полученными значениями, после чего из map который ниразу не вызывался на итерацию удаляются значения. Как вы поняли оно не работает, а у меня идеи кончились.