Код вроде работает как надо, сделал только модификацию в метод removeItemFromMapByValue добавил break; после удаления элемента из map. Потому что если убрать break то тогда удаляет все копии переданной строки из map будь их хоть 30 если например просто вызвать метод ради интереса просто проверить функционал вне циклов (потому как сам метод имеет свой итератор и проходиться по элементам снова и снова пока не удалит все ее копии).